3

在按照本教程查找 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)

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

4

2 回答 2

3

您尝试执行的操作要求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 会更容易。

于 2018-08-02T22:45:04.460 回答
0

包含“af-description”类的 div 不包含在 DOM 中,而是包含在 js 脚本中。找不到是正常的。

如果您测试您的脚本以从 DOM 中找到一个类,例如这个“afg-page 行”,您应该没问题。

于 2018-08-02T22:43:53.063 回答