【问题标题】:Python XPath returning empty lists from Google Project SunroofPython XPath 从 Google Project Sunroof 返回空列表
【发布时间】:2019-12-15 02:33:20
【问题描述】:

我正在尝试从 Google 的 Project Sunroof 中提取平方英尺和日照时间的数据,但是 XPath 只返回空白字符串。 这是一个Lowe's作为地址的相关代码:

   from lxml import

   htmlpageContent=requests.get('https://www.google.com/get/sunroof/building/34.00192560211979/-81.21430071233021/#?f=buy')
   tree = html.fromstring(pageContent.content)

   print(tree.xpath("/html/body/div[1]/address-view/div[1]/div/div/section[1]/div[2]/md-card[1]/ul/li[1]/div[2]"))     
   print(tree.xpath("/html/body/div[1]/address-view/div[1]/div/div/section[1]/div[2]/md-card[1]/ul/li[2]/div[2]/text()"))

在这种情况下,我想要一些类似的东西:

[1,581 hours of usable sunlight per year]

[134,199 sq feet available for solar panels ]

我只是得到:

[]

[]

我是这样的网络抓取和 xpath 的新手,所以我无法进行太多测试,但我知道不同的路径都会输出一个空白列表。

【问题讨论】:

  • 总的来说,我认为 xpath 表达式的风格非常脆弱。无论如何,你做了什么来调试这个?您通常如何调试这种网络抓取?
  • 此页面使用 JavaScript 向页面添加项目 - 您无法使用 requestlxmlBeautifulSoup 获取它,因为它们无法运行 JavaScript。您可能需要Selenium 来控制可以运行 JavaScript 的网络浏览器。
  • 顺便说一句:下次在浏览器中关闭 JavaScript 并重新加载页面,看看 Python 能得到什么。

标签: python xpath web-scraping


【解决方案1】:

正如@furas 指出的那样,对于依赖 Javascript 获取内容的页面(现在大多数情况下),您需要使用 selenium 之类的东西来控制实际的 Web 浏览器。一个简单的解决方案可能如下所示:

>>> from selenium import webdriver
>>> d = webdriver.Chrome()
>>> d.get('https://www.google.com/get/sunroof/building/34.00192560211979/-81.21430071233021/#?f=buy')
>>> [e.text for e in d.find_elements_by_css_selector('.panel-fact-text')]
['1,581 hours of usable sunlight per year', '134,199 sq feet available for solar panels']
>>> d.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多