python tree.xpath返回空列表

问题描述 投票:0回答:2

我很难弄清楚为什么下面代码中显示的tree.xpath方法会返回一个空列表。在此示例中,我只是尝试在Yahoo财务中的“ People Also Watch”横幅下检索股票行情指示器,这似乎微不足道,但到目前为止无法正常工作。

我正在从检查元素页面复制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')```




python xpath web-scraping
2个回答
0
投票

您正在尝试解析页面,该页面正被浏览器重新翻译为HTML代码。如果打开页面的源代码-您将看到它具有一个大的脚本标签,其中所有数据都需要渲染。

您有两种方法来处理这种情况:

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

这是关于在浏览器中打开页面,从中获取呈现的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()

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

pip install selenium

2。将脚本解析为Object(尤其是节点root.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.

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


0
投票

如果您像硒一样不需要任何辅助软件包,并且您只想使用请求和lxml,就像我自己所做的那样。我已经将regex用于此类事情:

例如,您可以只查看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中找到更多信息,但是可能会困难得多

© www.soinside.com 2019 - 2024. All rights reserved.