我试图解析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
阵列的一致性。
如何在每列中获取所有值(按顺序)的变量数组,无论它们是否在跨度中?我不关心颜色,我只关心价值观。
如果需要,我可以解释更多。谢谢!!
您可以直接跳过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