#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. спасибо, шеф, я рассмотрю это. Мне нужно многое пересмотреть для моих кодов как любителям.