您要尝试执行的操作要求HTML源代码包含具有此类的元素。浏览器的功能不只是下载HTML。当页面引用该页面时,它还会下载CSS和Javascript代码,并执行该页面附带的所有脚本,这可能会触发进一步的网络活动。如果您要查找的内容是由Javascript生成的,则可以在浏览器开发工具检查器中看到这些元素,但这不能使该r.html对象可访问该元素!
对于您尝试抓取的URL,如果您查看网络控制台,则会看到发出了AJAX请求GET请求http://mentalfloss.com/api/facts来填充
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)
>>> _.text
'The cubicle did not get its name from its shape, but from the Latin “cubiculum” meaning bed chamber.'
但是,这需要您的计算机做更多的工作。对于此特定示例,直接调用API会更容易。