有没有一种方法可以过滤beautifulsoup find_all结果,仅限于.jpeg,但不能过滤其他格式?

时间:2019-04-01 03:49:20

标签: python-3.x beautifulsoup python-requests jpeg gif

我想从论坛上获取一些图片。 find_all结果为我提供了我想要的大多数jpeg文件。但是,它也给了我一些我不想要的gif文件。另一个问题是gif文件是附件,不是有效的链接,在保存文件时会引起麻烦。

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

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

3 个答案:

答案 0 :(得分:1)

请尝试以下操作,我认为您可以缩短此操作。它使用带有运算符($)的结尾来指定子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']")]

答案 1 :(得分:1)

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

import re
from bs4 import BeautifulSoup

data='''<html>
<body>

<h2>List of images</h2>

<div class="t_msgfont">
<img src="img_chania.jpeg" alt="" width="460" height="345">
<img src="wrongname.gif" alt="">
<img src="img_girl.jpeg" alt="" width="500" height="600">
</div>
</body>
</html>'''

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

答案 2 :(得分:1)

我建议您使用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)