【问题标题】:Reading a webpage using lxml and xpath使用 lxml 和 xpath 读取网页
【发布时间】:2016-01-09 22:32:38
【问题描述】:

我正在尝试从 PredictIt 获取一些市场的最新价格。例如,“唐纳德特朗普会赢得 2016 年共和党总统候选人提名吗?”在https://www.predictit.org/contract/838/ 找到的市场 我特别想要“最新价格:??

Chrome 告诉我 xpath 是 /html/body/div[7]/div/div[2]/div[2]/p[1]/strong/text()

import urllib2
url = 'https://www.predictit.org/Contract/838/'
page = urllib2.urlopen(url)
date = page.read()

from lxml import html
etree = html.fromstring(data)
price = etree.xpath('/html/body/div[7]/div/div[2]/div[2]/p[1]/strong/text()')

一切看起来都很好,但是

 print price

返回一个空列表。

有什么想法吗?

【问题讨论】:

    标签: python-2.7 xpath lxml urllib2


    【解决方案1】:

    如果您可以依赖 'Latest Price' 标记内的字符串 <strong>,那么您可以使用:

    In [305]: root.xpath('//strong[contains(text(), "Latest Price:")]/text()')
    Out[305]: ['Latest Price: 34']
    

    或者,也许更可靠的是,您可以搜索所有 <p> 标签及其后代以查找包含字符串 'Latest Price' 的文本:

    In [312]: root.xpath('//p/descendant-or-self::*[contains(text(), "Latest Price")]/text()')
    Out[312]: ['Latest Price: 34']
    

    import urllib2
    url = 'https://www.predictit.org/Contract/838/'
    page = urllib2.urlopen(url)
    data = page.read()
    
    import lxml.html as LH
    root = LH.fromstring(data)
    price = None
    for text in root.xpath('//p/descendant-or-self::*[contains(text(), "Latest Price:")]/text()'):
        price = float(text.split(':', 1)[-1])
    
    print(price)
    # 35
    

    XPath /html/body/div[7]/div/div[2]/div[2]/p[1]/strong/text() 可能失败的原因是因为从 urllib2.urlopen(url).read() 收到的 HTML 可能与 Chrome 收到的 HTML 不同。 Chrome 的浏览器会处理可能会更改 DOM 的 JavaScript。 urllib2 不处理 JavaScript。如果您在执行 JavaScript 后需要 DOM,那么您将需要像 Selenium 这样的自动化浏览器,而不是 urllib2。幸运的是,在这种情况下,您要查找的内容不是由 JavaScript 提供的。但是,过于具体的 XPath(例如 /html/body/div[7]/div/div[2]/div[2]/p[1]/strong/text())可能会让您失望。

    使用urllib2返回的HTML,似乎只有6个<div>标签:

    In [315]: root.xpath('/html/body/div')
    Out[315]: 
    [<Element div at 0x7f0bd63632b8>,
     <Element div at 0x7f0bd6363310>,
     <Element div at 0x7f0bd6363368>,
     <Element div at 0x7f0bd63633c0>,
     <Element div at 0x7f0bd6363418>,
     <Element div at 0x7f0bd6363470>]
    

    尝试访问第 7 个 &lt;div&gt; 标记会产生一个空列表:

    In [316]: root.xpath('/html/body/div[7]')
    Out[316]: []
    

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2016-06-23
      • 1970-01-01
      • 2021-12-18
      相关资源
      最近更新 更多