Beautifulsoup 过滤“find_all”结果,通过正则表达式限制为 .jpeg 文件

Posted

技术标签:

【中文标题】Beautifulsoup 过滤“find_all”结果,通过正则表达式限制为 .jpeg 文件【英文标题】:Beautifulsoup filter "find_all" results, limited to .jpeg file via Regex 【发布时间】:2019-08-22 04:37:01 【问题描述】:

我想从论坛获取一些图片。 find_all 结果给了我最想要的东西,它们是 jpeg 文件。然而,它也给了我一些我不想要的 gif 文件。另一个问题是gif文件是附件,不是有效链接,我保存文件时会引起麻烦。

soup_imgs = soup.find(name='div', attrs='class':'t_msgfont').find_all('img', )
for i in soup_imgs:
    src = i['src']
    print(src)

我试图在我的 find_all 选择搜索中避免使用 gif 文件,但没用,jpeg 和 gif 文件都在同一部分中。那我应该怎么做才能过滤我的结果呢?请给我一些帮助,酋长。我对编码非常业余。玩 Python 只是我的一个爱好。

【问题讨论】:

您能否提供示例输出和附加代码(如果需要,请提供一个虚拟站点 url)?另外,不知道细节,你试过简单的`if`条件过滤吗? 【参考方案1】:

您可以通过正则表达式对其进行过滤。请参考以下示例。希望对您有所帮助。

import re
from bs4 import BeautifulSoup

data='''<html>
<body>

<h2>List of images</h2>

<div class="t_msgfont">
<img src="img_chania.jpeg"   >
<img src="wrongname.gif" >
<img src="img_girl.jpeg"   >
</div>
</body>
</html>'''

soup=BeautifulSoup(data, "html.parser")
soup_imgs = soup.find('div', attrs='class':'t_msgfont').find_all('img',  ,src=re.compile(".jpeg"))
for i in soup_imgs:
    src = i['src']
    print(src)

【讨论】:

src=re.compile(".jpeg") 成功了,强大!谢谢队友 很高兴为您提供帮助【参考方案2】:

尝试以下我怀疑你可以缩短的方法。它使用以运算符($)结尾来指定子 img 元素的 src 属性值以 .jpg 结尾(根据 OP 的注释,它实际上是 jpg,从 jpeg 编辑为 jpg)

srcs = [item['src'] for item in soup.select("div.t_msgfont img[alt=''][src$='.jpg']")]

看看缩短选择器(我不能不看到有问题的 HTML),你可能会得到类似的东西

srcs = [item['src'] for item in soup.select(".t_msgfont [alt=''][src$='.jpg']")]

甚至

srcs = [item['src'] for item in soup.select(".t_msgfont [src$='.jpg']")]

【讨论】:

我需要导入任何东西才能使用“$”吗?看来我的脚本一直给我无效的语法。 立即尝试。我没有将内部的 "" 更改为 '' 奇怪,它正在运行,但 [src$='.jpeg'] 没有结果,我检查了文件扩展名,它们是 jpg,当我去掉“e”时,语法错误。 .. 所以你得到了 srcs = [item['src'] for item in soup.select("div.t_msgfont img[alt=''][src$='.jpg'] 的错误")] 试试上面的方法,也试试 srcs = [item['src'] for item in soup.select(".t_msgfont [src$='jpg']")]【参考方案3】:

我建议您使用requests-html 来查找页面中的图像资源。 与BeautifulSoup + requests 相比,它非常简单。

这是执行此操作的代码。

from requests_html import HTMLSession
session = HTMLSession()
resp = session.get(url)
for i in resp.html.absolute_links:
    if i.endswith('.jpeg'):
        print(i)

【讨论】:

谢谢大佬,我会调查的。作为业余爱好者,我有很多需要修改的代码。

以上是关于Beautifulsoup 过滤“find_all”结果,通过正则表达式限制为 .jpeg 文件的主要内容,如果未能解决你的问题,请参考以下文章

03_BeautifulSoup的使用2-搜索文档树

爬虫:BeautifulSoup--select

BeautifulSoup 中“findAll”和“find_all”的区别

BeautifulSoup.find_all() 方法不适用于命名空间标签

BeautifulSoup 从 find_all 的结果中找到 url

BeautifulSoup库之find_all函数