Есть ли способ отфильтровать результаты BeautifulSoup find_all, ограниченный .jpeg, но не другие форматы? - PullRequest
1 голос
/ 01 апреля 2019

Я хотел бы приобрести несколько фотографий с форума.Результаты 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)

Я пытался избежать того, что gif-файлы в моем поиске по выборкам find_all, но бесполезны, jpeg и gif-файлы находятся в одном разделе.Что я должен сделать, чтобы отфильтровать результат?Пожалуйста, помогите мне, шеф.Я довольно любитель кодирования.Играть с Python - это мое хобби.

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Вы можете отфильтровать его с помощью регулярного выражения. Пожалуйста, обратитесь к следующему примеру. Надеюсь, это поможет.

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)
1 голос
/ 02 апреля 2019

Я бы предложил вам использовать reports-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)
1 голос
/ 01 апреля 2019

Попробуйте следующее, которое, я подозреваю, вы можете сократить. Он использует конец с оператором ($), чтобы указать, что значение атрибутов src дочерних элементов img оканчивается на .jpg (отредактировано в jpg из jpeg в свете комментария OP, что на самом деле это 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']")]
...