HTML Yahoo! 的抓取工具财务使用 lxml 和请求返回错误值

HTML Scraper for Yahoo! Finance returning wrong value using lxml and requests

from lxml import html
import requests

page = requests.get('https://finance.yahoo.com/quote/AMZN?p=AMZN&.tsrc=fin-srch')
tree = html.fromstring(page.content)

peRatio = tree.xpath('//span[@class="Trsdu(0.3s) "] [@data-reactid="92"]/text()')
peRatio

如果我写了 [@data-reactid="92"],上面会输出预期的结果,它给了我 2,075.74。有谁知道为什么会这样?我期望得到 81.48,这可以在 AMZN 股票的源代码中看到。

编辑:我发现了一些奇怪的东西。我在 HTML 脚本中看到的内容始终被 26 关闭。所以当我使用 [@data-reactid="66"] 时,我得到了我原来的样子寻找。同样,118-92 = 26。这适用于其他几个案例。知道这是为什么吗?

看起来是个错误? data-reactid 值按升序排序,与相应跨度的文本值不匹配。因此 span 的文本值按文档顺序打印,而 data-reactid 值被排序然后它们被错误地匹配。 IE 15 returns 1,636.40 实际上是 41.

<span class="Trsdu(0.3s) " data-reactid="41">1,636.40</span>

我正在检查我的旧代码,看看我们是否可以修复您的 xpath 以使其正常工作。这是我看到问题的方式。如果我找到合适的解决方案,将在几个小时后更新 return,如果其他人有答案,将删除它。

print(tree.xpath('//span[@class="Trsdu(0.3s) "]/text()'))
print(tree.xpath('//span[@class="Trsdu(0.3s) "]/@data-reactid'))

['1,636.40', '1,628.18', '1,639.00 x 900', '1,640.25 x 900', '3,148,824', '6,293,333', '806.108B', '1.71', '81.48', '20.14', 'N/A', '2,075.74']
['15', '20', '25', '30', '43', '48', '56', '61', '66', '71', '87', '92']