(HTML Scraping)列的XPath根据颜色而变化

问题描述 投票:1回答:1

我试图解析this website (with different stock tickers)列中的所有值。我正在使用Python并使用XPath来抓取HTML数据。

假设我想提取“变化”的值,目前为0.62%(和绿色)。我先把树拿到网站然后说。

stockInfo_1 = tree.xpath('//*[@class="table-dark-row"]/td[12]/b/span/text()') 

然后我会得到一个值数组,最后一个元素恰好是更改值。

但是,我注意到如果此列中的值有颜色,则它在/b/SPAN中,而如果它没有颜色,则没有跨度,它只在/b中。

所以解释一下:

stockInfo_1 = tree.xpath('//*[@class="table-dark-row"]/td[12]/b/span/text()') 

^此数组将使此列中的每个值都为彩色

while stockInfo_1 = tree.xpath('//*[@class="table-dark-row"]/td[12]/b/text()') 

^将使列中没有颜色的每个值都有。

每种库存的颜色不一致。有些股票的颜色是随机值,有些则没有。所以这会弄乱/b/span/b阵列的一致性。

如何在每列中获取所有值(按顺序)的变量数组,无论它们是否在跨度中?我不关心颜色,我只关心价值观。

如果需要,我可以解释更多。谢谢!!

python html xpath web-scraping
1个回答
2
投票

您可以直接跳过xpath中的中间标记,并使用// inbetween获取列表中的所有值。

所以片段应该是

tree.xpath('//*[@class="table-dark-row"]/td[12]/b//text()')

这会跳过文本之间的所有中间标记。

我尝试过使用lxml。这是代码

import requests
from lxml import html
url="https://finviz.com/quote.ashx?t=acco&ty=c&ta=1&p=d"
resp=requests.get(url)
tree = html.fromstring(resp.content)
values = tree.xpath('//*[@class="table-dark-row"]/td[12]/b//text()')
print values

其中输出如下

['0.00%', '-2.43%', '-8.71%', '-8.71%', '7.59%', '-1.23%', '1.21', '0.30', '2.34% 2.38%', '12.05', '12.18', '1.04%']

注意:如果您不想在上面的Xpath中硬编码12,您可以使用last()作为tree.xpath('//*[@class="table-dark-row"]/td[last()]/b//text()')

Xpath cheat sheet供您参考。

Using "//" And ".//" Expressions In XPath XML Search Directives In ColdFusion

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