python tree.xpath返回空列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python tree.xpath返回空列表相关的知识,希望对你有一定的参考价值。
我很难弄清楚为什么下面代码中显示的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')```
您正在尝试解析页面,该页面正被浏览器重新翻译为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.
在这种情况下,我不会提供任何代码,因为它需要为您的任务编写几乎整个解析器。
如果您像硒一样不需要任何辅助软件包,并且您只想使用请求和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中找到更多信息,但是可能会困难得多
以上是关于python tree.xpath返回空列表的主要内容,如果未能解决你的问题,请参考以下文章
如何用 Python 和 lxml 抓取这个网页?返回空列表
[python]glob模块中的glob()函数为什么返回空列表??
2021-08-04:给定一个字符串str,当然可以生成很多子序列。返回有多少个子序列是回文子序列,空序列不算回文。比如,str = “aba”,回文子序列:{a}{a} {a,a} {b}{(代码片