使用请求 HTML 找不到 css class

Cannot find css class using Request HTML

在跟随 this tutorial 找到 css class 并在网站上复制文本后,我尝试将其实现为一个小文本代码,但遗憾的是它没有用。 我完全按照同一网站上的教程进行操作,并确实获得了网页的标题,但无法使该过程适用于该网页或任何其他网页上的任何其他 class。我错过了什么吗?我是一名初级程序员,以前从未使用过 Request HTML 或类似的东西。 这是我正在使用的代码示例,目的是获取加载网页时出现在 "af-description" class 中的随机事实。

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)

无论我多么努力,无论我如何重新排列或尝试不同的代码,我都无法让它工作。似乎无法找到 class 或 class 包含的文本。请帮忙。

包含class 'af-description'的div不包含在DOM中,而是包含在js脚本中。找不到很正常

如果您测试脚本以从 DOM 中找到一个 class,就像这个 'afg-page row' 你应该没问题。

您要执行的操作要求 HTML 来源 包含具有此类 class 的元素。浏览器不仅仅可以下载 HTML;它还会在页面引用时下载 CSS 和 Javascript 代码,并执行附加到页面的任何脚本,这可以触发进一步的网络 activity。如果您要查找的内容是由 Javascript 生成的,您可以在浏览器开发工具检查器中看到这些元素,但这并不能使 r.html 对象可以访问该元素!

在您尝试抓取的 URL 的情况下,如果您查看网络控制台,您会看到 AJAX 请求 GET 请求 http://mentalfloss.com/api/facts 被填充<div af-details> 结构,所以如果你想抓取该数据,你可以直接从 API:

中以 JSON 的形式获取它
r = session.get('http://mentalfloss.com/api/facts')
description = r.json()[0]['fact']
print("Fun Fact:" + fact)

您可以进行 requests_html 会话 render the page with Javascript too by calling 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 更容易。