【问题标题】:parsing xml - off by a node解析 xml - 由节点关闭
【发布时间】:2017-11-15 04:13:48
【问题描述】:

我正在尝试解析来自雅虎财务页面的值。我使用 Chrome 来检查感兴趣的元素(股票的当前价格)并在这个简单的脚本中使用 xpath:

from lxml import html
import requests

page = requests.get('https://finance.yahoo.com/quote/VNQ?p=VNQ')
tree = html.fromstring(page.content)

print tree.xpath('//*[@id="quote-header-info"]/div[3]/div[1]/div/span[1]/text()')

但是,我得到的是来自下一个 span 标签的文本值。我试图改变 Chrome 给我的 xpath 以获取以前的文本值,但没有成功。谁能告诉我哪里出错了?

【问题讨论】:

  • 确定所有这些硬编码的索引都是正确的吗?
  • 发布预期结果
  • 它们是从 Chrome 复制路径中剪切/粘贴的,并突出显示所需的文本。我不明白的两件事是为什么它给出了下一个跨度标签文本的 xpath 而不是突出显示的文本。其次,假设 Chrome 提供了不正确的 xpath,我该如何更改它以获得正确的 xpath(因为它非常接近)。
  • 预期结果是当前价格,当然在市场时段内会不断变化,但如果您转到脚本中的页面,您会看到 36px 类型的数字。
  • 如果有人能告诉我一个更好的方法来解析这个网页以获得这个(或另一个值),请告诉我正确的技术。

标签: xml xpath lxml


【解决方案1】:

如果这是您想要的价格,您可以从页面中更简单的位置获取。例如标题 html 标记包含它。通过一些字符串解析,您将获得正确的值。该值始终位于第一个空格之后。

from lxml import html
import requests

page = requests.get('https://finance.yahoo.com/quote/VNQ?p=VNQ')
tree = html.fromstring(page.content)

title = tree.xpath('//title/text()')[0]
value = title.split()[1]

print(value)

【讨论】:

  • 谢谢。我刚刚尝试了您的脚本并得到:> python stack.py Traceback(最近一次调用最后一次):文件>“stack.py”,第8行,在> value = int(title.split()[1]) ValueError: int() 基数为 10 的无效文字:':' 我会再玩一些。
  • 尝试不使用 Int()。刚刚更新了我回复中的代码。如果可行,请接受我的回答。
  • >>> from lxml import html >>> import requests >>> page = requests.get('finance.yahoo.com/quote/VNQ?p=VNQ') >>> tree = html.fromstring(page.content) >>> title = tree.xpath('//title/text()')[0] >>> value = title.split()[1] >>> print(value) :
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多