使用 Python requests.get 解析 html 不会立即加载的代码

Using Python requests.get to parse html code that does not load at once

我正在尝试编写一个 Python 脚本,该脚本将定期检查网站以查看某个项目是否可用。我过去曾成功地使用 requests.get、lxml.html 和 xpath 来自动执行网站搜索。对于这个特定的 URL (http://www.anthropologie.com/anthro/product/4120200892474.jsp?cm_vc=SEARCH_RESULTS#/) 和同一网站上的其他人,我的代码无法正常工作。

import requests
from lxml import html
page = requests.get("http://www.anthropologie.com/anthro/product/4120200892474.jsp?cm_vc=SEARCH_RESULTS#/")
tree = html.fromstring(page.text)
html_element = tree.xpath(".//div[@class='product-soldout ng-scope']")

此时,html_element 应该是一个元素列表(我认为在这种情况下只有 1 个),但它是空的。我认为这是因为网站没有一次加载所有内容,所以当 requests.get() 出去抓取它时,它只抓取了第一部分。所以我的问题是 1:我对问题的评估是否正确? 和 2:如果是这样,有没有办法让 requests.get() 在返回 html 之前等待,或者可能是完全获取整个页面的另一条路线。

谢谢

编辑:感谢两位回复。我使用了 Selenium 并让我的脚本运行起来。

该页面使用 javascript 加载 table,当请求获得 html 时未加载,因此您获得的是所有 html 而不是生成的内容使用 javascript,您可以使用 selenium combined with phantomjs 进行无头浏览以获得 html:

from selenium import webdriver

browser = webdriver.PhantomJS()
browser.get("http://www.anthropologie.eu/anthro/index.jsp#/")
html = browser.page_source
print(html)

您对问题的评估不正确。

您可以查看结果,发现在接近结尾处有一个 </html>。这意味着您已经获得了整个页面。

并且requests.text 总是抓取整个页面;如果你想一次流式传输一点,你必须明确地这样做。

您的问题是 table 实际上并不存在于 HTML 中;它由客户端动态构建 JavaScript。您可以通过实际阅读返回的 HTML 来了解这一点。所以,除非你 运行 那 JavaScript,你没有信息。

对此有许多通用的解决方案。例如:

  • 使用 selenium 或类似驱动实际浏览器下载页面。
  • 手动计算出 JavaScript 代码的作用并在 Python 中进行等效工作。
  • 运行 一个无头的 JavaScript 解释器反对你建立的 DOM。