Как я могу отфильтровать миниатюры вложений в BeautifulSoup? - PullRequest
0 голосов
/ 16 апреля 2019

Я новичок в мире питонов. Я написал скрипт BeautifulSoup, снимающий изображения с форума в более ранние дни, и он отлично работает со второй страницы и далее. На первой странице есть несколько постов с вложениями, некоторые миниатюры в формате JPEG, но это недействительная ссылка для скачивания.

Я не очень старался с кодами, поэтому я просто отказался от страницы 2 и далее. Но я все еще хочу записку с самой первой страницы.

import requests
import bs4
import re

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/73.0.3683.105 Safari/537.36 Vivaldi/2.4.1488.38'
}
url = "http://www.sechongse.com/forum/thread-10106367-1-1.html"
response = requests.get(url, headers=headers).content
soup = bs4.BeautifulSoup(response, 'html.parser')
soup_imgs = soup.find(name='div', attrs={'class':'t_msgfont'})\
        .find_all('img', alt="", src=re.compile(".jpg"))
for i, img in enumerate(soup_imgs, 1):
    src = img['src']
    print(src)

DOM

attachments/month_1809/20180920_97a05cfc4ae8f0950356vcm54UmZbB5C.jpg
attachments/month_1809/20180920_c9f7ee5420e277ade049cdwQ7n5sQ3Nj.jpg
attachments/month_1809/20180920_111cbfcd81acbe556bceI8ZZluQ7mwvY.jpg
attachments/month_1809/20180920_e94dafd7c8b1ca99c1035YS0TnpdUCHO.jpg

Process finished with exit code 0

сообщений, подобных этому, довольно легко найти в моем сценарии, и все же, я не могу сойти с рук с этими вложениями, так как же я могу обойти это тогда? какие-нибудь методы? повторно? спасибо всем!

1 Ответ

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

Это делается с помощью Beautiful Soup 4.7 +.

Похоже, что CSS селекторы могут хорошо сработать для вас в этом.Здесь мы проверяем, что src заканчивается на .jpg, но не начинается с attachments.Мы можем использовать $= для проверки конца атрибута и ^= для проверки начала:

import bs4

html = """
<img src="attachments/month_1809/20180920_97a05cfc4ae8f0950356vcm54UmZbB5C.jpg"/>
<img src="some/other/image/20180920_97a05cfc4ae8f0950356vcm54UmZbB5C.jpg"/>
"""

soup = bs4.BeautifulSoup(html, 'html.parser')
for img in soup.select('img[src$=".jpg"]:not([src^=attachments])'):
    src = img['src']
    print(src)

Вывод

some/other/image/20180920_97a05cfc4ae8f0950356vcm54UmZbB5C.jpg

Для тех, кто этого не делаеткак с помощью селекторов

import bs4
import re

html = """
<img src="attachments/month_1809/20180920_97a05cfc4ae8f0950356vcm54UmZbB5C.jpg"/>
<img src="some/other/image/20180920_97a05cfc4ae8f0950356vcm54UmZbB5C.jpg"/>
"""

soup = bs4.BeautifulSoup(html, 'html.parser')
for img in soup.find_all('img', src=re.compile('^(?!attachments).*\.jpg$')):
    src = img['src']
    print(src)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...