Красивый суп не может найти все теги изображений в HTML (останавливается ровно на 5) - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь использовать beautifulsoup, чтобы получить все изображения сайта определенного класса.Моя проблема в том, что когда я запускаю код, просто чтобы увидеть, может ли мой код найти каждое изображение, он получает только изображения 1-5.Я думаю, что проблема в html, так как изображения 6-end расположены во вложенном div, но Find_all должен быть в состоянии найти все img с одним и тем же классом.

import requests, os, bs4, sys, webbrowser

url = 'https://mangapanda.onl/chapter/'
os.makedirs('manga', exist_ok=True)

comic = sys.argv[1:]
aComic = '-'.join(sys.argv[1:])  

issue = input('which issue do you want?')
aIssue = ('/chapter-' + issue)
aComic = (aComic + '_110' +  aIssue) 

comicUrl = (url + aComic)
res = requests.get(comicUrl)
res.raise_for_status()

soup = bs4.BeautifulSoup(res.text, 'html.parser')


comicElem = soup.find_all(class_="PB0mN")  
if comicElem == []:
    print('nothing in the list')
else:
    print('There are ' + str(len(comicElem)) + ' on this page')
    for i in range(len(comicElem)):
        comicPage = comicElem[i].get('src')
        print(str(comicPage) + '\n')

Есть ли что-то, чего мне не хватает, когда дело доходит до использования красивого супа, который мог бы помочь мне решить эту проблему?это HTML, который вызывает эту проблему?Был ли лучший способ, которым я мог бы диагностировать эту проблему сам, который был бы в моей сфере возможностей (примечание: в настоящее время я изучаю книгу «Автоматизация скучного материала с помощью Python». Именно здесь у меня появилась идея для этогоМини-проект и хорошая идея о том, где мой уровень мастерства в Python. Наконец, я использую BeautifulSoup, чтобы узнать больше о нем. Если возможно, я бы хотел решить эту проблему, используя BeautifulSoup, исследует другие варианты парсинга через HTML, если мне нужно.

Использование Firefox Quantim 59.0.2 с использованием Python3

PS, если вы знаете другие вопросы, которые, возможно, ответили на эту проблему, уже не стесняйтесь просто связать меня с ней. Я действительно хотел простовыяснить ответ через чужие вопросы, но, похоже, моя проблема была довольно уникальной.

1 Ответ

0 голосов
/ 25 апреля 2018

Проблема в том, что некоторые изображения добавляются в DOM через Javascript после загрузки страницы.Таким образом,

res = requests.get(comicUrl)

получает HTML и DOM, прежде чем какие-либо изменения будут сделаны javascript.Вот почему

soup = bs4.BeautifulSoup(res.text, 'html.parser')
comicElem = soup.find_all(class_="PB0mN")
len(comicElem) # = 5

находит только 5 изображений.

Если вы хотите получить все загруженные изображения, вы не можете использовать библиотеку запросов.Вот пример использования селена:

from selenium import webdriver
browser = webdriver.Chrome('/Users/glenn/Downloads/chromedriver')
comicUrl = "https://mangapanda.onl/chapter/naruto_107/chapter-700.5"
browser.get(comicUrl)
images = browser.find_elements_by_class_name("PB0mN")
for image in images:
    print(image.get_attribute('src'))
len(images) # = 18 images

См. Этот пост для получения дополнительных ресурсов по очистке страниц javascript: Скрипт веб-страницы JavaScript с Python

Относительно того, как сказатьесли HTML изменяется с помощью JavaScript?

У меня нет жестких правил, но вы можете выполнить следующие следственные действия:

Как вы заметили, только 5 изображений первоначально были отправлены с запросами, но было видно, что на странице больше изображений.является первым признаком того, что DOM изменяется после загрузки.

Второй шаг: с помощью браузера Developer Tools -> Scripts вы можете увидеть несколько файлов javascript, связанных со страницей.Обратите внимание, что не все javascript изменяют DOM, поэтому наличие этих сценариев не обязательно означает, что они изменяют DOM.

Для дальнейшей проверки DOM изменяется после загрузки страницы:

Скопируйте html из Developer Tools -> View Source Source в инструмент форматирования HTML, такой как http://htmlformatter.com,, отформатируйте html и посмотрите на количество строк.Инструменты разработчика -> Просмотр страницы источника - это HTML-код, отправляемый сервером без каких-либо изменений.

Затем скопируйте HTML-код из Инструменты разработчика -> Элементы (обязательно получите все из <html>...</html>)и скопируйте его в инструмент форматирования HTML, например http://htmlformatter.com,, и посмотрите на количество строк.Инструменты разработчика -> Элементы HTML - это полный, модифицированный DOM.

Если количество строк значительно отличается, то вы знаете, что DOM изменяется после загрузки.

Сравнение количества строк для "https://mangapanda.onl/chapter/naruto_107/chapter-700.5" показывает 479 строк для исходного htmlи 3245 строк для полного DOM, так что вы знаете, что что-то модифицирует DOM после загрузки страницы.

...