【问题标题】:Using Python requests.get to parse html code that does not load at once使用 Python requests.get 解析不会立即加载的 html 代码
【发布时间】:2015-07-11 19:46:53
【问题描述】:

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

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 并让我的脚本正常工作。

【问题讨论】:

    标签: python html web-scraping python-requests


    【解决方案1】:

    您对问题的评估不正确。

    您可以检查结果并看到在末尾附近有一个</html>。这意味着您已经获得了整个页面。

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

    您的问题是该表格实际上并不存在于 HTML 中;它是由客户端 JavaScript 动态构建的。您可以通过实际阅读返回的 HTML 来了解这一点。因此,除非您运行该 JavaScript,否则您不会获得这些信息。

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

    • 使用selenium 或类似方式驱动实际浏览器下载页面。
    • 手动计算 JavaScript 代码的作用,并在 Python 中进行等效的工作。
    • 针对您构建的 DOM 运行无头 JavaScript 解释器。

    【讨论】:

      【解决方案2】:

      页面使用 javascript 加载请求获取 html 时未加载的表,因此您获取的所有 html 不是使用 javascript 生成的,您可以使用 selenium 结合 phantomjs 进行无头浏览获取html:

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

      【讨论】:

      • 如何设置 PhantomJs 和 selenium?
      猜你喜欢
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多