Python Tree.xPath 返回空列表



我很难弄清楚为什么下面代码中显示的tree.xpath方法会返回一个空列表。 在这个例子中,我只是试图在雅虎财经的"人们也关注"横幅下检索股票代码,这看起来微不足道,但到目前为止无法使其工作。

我正在从检查元素页面复制 xpath。还尝试手动更改 xpath,例如删除"tbody",但也没有效果。 任何帮助将不胜感激。谢谢

import requests
from lxml import html

ticker = 'TSLA'
url = 'https://finance.yahoo.com/quote/'+str(ticker)+'?p='+str(ticker)
page = requests.get(url)
tree = html.fromstring(page.content)
tree.xpath('//*[@id="rec-by-symbol"]/table/tbody/tr[1]/td[1]/a')```


您正在尝试解析页面,该页面正在被浏览器转换为HTML代码。如果你打开页面的源代码 - 你会看到,它有一个大的脚本标签,所有数据都是渲染器。

有两种方法可以处理这种情况:

1. 渲染页面并在其中运行 XPathes。

它是关于在浏览器中打开页面,从中呈现 DOM 并运行 XPath。

在这种情况下使用的最佳工具 - 带有某种网络驱动程序的硒(通过 python 代码控制浏览器(

适用于您的情况的示例代码:

from selenium import webdriver
driver = webdriver.Chrome()
ticker = 'TSLA'
url = 'https://finance.yahoo.com/quote/'+str(ticker)+'?p='+str(ticker)
driver.get(url)
xpath = '//*[@id="rec-by-symbol"]/table/tbody/tr[1]/td[1]/a'
found_nodes = driver.find_elements_by_xpath(xpath)
for node in found_nodes:
print(node.text)
driver.close()
driver.quit()

但是您需要安装硒并下载正确的驱动程序。对于我在示例中使用的Chrome,它将是chromedriver(您可以在此处获得:https://chromedriver.chromium.org/(:

pip install selenium

2. 将脚本解析为对象(尤其是节点根目录。App.main(并使用它

这是更复杂的方式,但不需要浏览器。

工作流程:

a. Download page via requests;
b. Get script with target data (via regular expressions);
c. load root.App.main as json Object (json.loads method);
d. Find necessary nodes in Object.

我不会为这种情况提供任何代码,因为它需要为您的任务编写几乎整个解析器。

如果您不需要任何侧包作为硒,并且只想使用请求和 lxml,就像我自己所做的那样。我已经将正则表达式用于以下事情:

例如,你可以只查看Page.context,并从网站中找到一些你需要的json结构,比如:

"NFLX":{"sourceInterval":15,"regularMarketOpen":{"raw":338.68,"fmt":"338.68"},"exchange":"NMS","regularMarketTime":{"raw":1579122001,"fmt":"4:00PM EST"},"fiftyTwoWeekRange":{"raw":"252.28 - 385.99","fmt":"252.28 - 385.99"},

在这里,您可以找到更多信息,而不仅仅是来自lxml,但可能要困难得多。

最新更新