Не удается найти класс CSS, используя запрос HTML

После изучения этого урока по поиску класса CSS и копированию текста на веб-сайте я попытался внедрить его в небольшой текстовый код, но, к сожалению, это не сработало. Я следовал учебному пособию точно на том же веб-сайте и получил заголовок веб-страницы, но не мог заставить этот процесс работать для любого другого класса на этой или любой другой веб-странице. Я что-то пропустил? Я начинающий программист и никогда раньше не использовал Request HTML или что-то подобное. Вот пример кода, который я использую, с целью получить случайный факт, который появляется в классе "af-description" при загрузке веб-страницы.

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('http://mentalfloss.com/amazingfactgenerator')
r.html.find('.af-description', first=True)
description = r.html.find('.af-description', first=True)
print("Fun Fact:" + description.text)

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

2 ответа

Решение

То, что вы пытаетесь сделать, требует, чтобы источник HTML содержал элемент с таким классом. Браузер делает гораздо больше, чем просто загружает HTML; он также загружает код CSS и Javascript, когда на него ссылается страница, и выполняет все сценарии, прикрепленные к странице, что может вызвать дальнейшую сетевую активность. Если содержимое, которое вы ищете, было сгенерировано Javascript, вы можете видеть элементы в инспекторе инструментов разработки браузера, но это не делает элемент доступным для r.html объект!

В случае URL, который вы пытались очистить, если вы посмотрите на сетевую консоль, вы увидите, что AJAX-запрос GET-запрос http://mentalfloss.com/api/facts сделан, чтобы заполнить <div af-details> структуры, так что если вы хотите очистить эти данные, вы можете просто получить их как JSON непосредственно из API:

r = session.get('http://mentalfloss.com/api/facts')
description = r.json()[0]['fact']
print("Fun Fact:" + fact)

Вы можете сделать requests_html сеанс рендеринга страницы тоже с помощью Javascript, вызвавr.html.render(),

Затем он использует безголовый браузер для рендеринга HTML-кода, выполнения встроенного в него JavaScript-кода, извлечения запроса AJAX и рендеринга дополнительных элементов DOM, а затем отображает всю страницу обратно в HTML для вашего кода. В первый раз, когда вы сделаете это, вам будут загружены необходимые библиотеки для автономной инфраструктуры браузера:

>>> from requests_html import HTMLSession
>>> session = HTMLSession()
>>> r = session.get('http://mentalfloss.com/amazingfactgenerator')
>>> r.html.render()
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
# .... a lot more information elided
[W:pyppeteer.chromium_downloader] chromium extracted to: /Users/mj/.pyppeteer/local-chromium/533271
>>> r.html.render()
>>> r.html.find('.af-description', first=True)
<Element 'div' class=('af-description',)>
>>> _.text
'The cubicle did not get its name from its shape, but from the Latin “cubiculum” meaning bed chamber.'

Однако для этого требуется, чтобы ваш компьютер выполнял гораздо больше работы; для этого конкретного примера проще просто вызвать API напрямую.

Div, который включает в себя класс af-description, включен не в DOM, а в сценарий js. Это нормально, чтобы не быть в состоянии найти это.

Если вы протестируете свой сценарий, чтобы найти класс из DOM, например, эту строку "afg-page", у вас все будет хорошо.

Другие вопросы по тегам