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