Beautifulsoup фильтрует результаты «find_all», ограниченные файлом .jpeg с помощью регулярного выражения

#python-3.x #beautifulsoup #python-requests #jpeg #gif

#python-3.x #beautifulsoup #python-запросы #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)
  

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

Комментарии:

1. не могли бы вы предоставить пример вывода и дополнительный код (при желании укажите фиктивный 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" 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. src= re.compile(«.jpeg») отлично сработал, мощный! спасибо, приятель

2. Рад вам помочь

Ответ №2:

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

Комментарии:

1. нужно ли мне что-либо импортировать, чтобы использовать «$»? Кажется, мой скрипт продолжает выдавать мне неверный синтаксис.

2. Попробуйте сейчас. Я не менял внутреннее «» на »

3. странно, он запущен, но нет результата от [src $ =’.jpeg’], я проверил расширение файла, они jpg, когда я избавляюсь от «e», синтаксическая ошибка…

4. Таким образом, вы получаете эту ошибку с srcs = [item[‘src’] для элемента в soup.select(«div.t_msgfont img[alt=»][src $ =’.jpg’]»)]

5. Попробуйте вышеуказанное, а также попробуйте srcs = [item[‘src’] для элемента в 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)
  

Комментарии:

1. спасибо, шеф, я рассмотрю это. Мне нужно многое пересмотреть для моих кодов как любителям.