我正在尝试选择表的最后一列中包含的值:https://ca.finance.yahoo.com/q/hp?s=bmo.TO&a=02&b=2&c=2005&d=02&e=2&f=2015&g=m
通常,这会很简单。像这样的东西:
response.xpath('//table//table//tr[::6]/text()').extract()
然而,由于雅虎选择将这些红利行放入其中,第 n 个元素不断变化。但是,我注意到对于我想要从中选择数据的每一行,第一个 td 包含:
Feb 2, 2015
而不是:
2015-01-29
因此,我试图构建一个遵循以下逻辑的代码:如果表的第一个单元格包含任何字母,则选择最后一列并将其附加到列表中。我的代码如下:
returns = []
trows = response.xpath('//table//table//tr')
for tr in trows:
# don't know why I need to use "2" in the following line, but that's what gives me the first value.
check = response.xpath('//td[2]/text()').extract()
if any(c.isalpha() for c in check) == True:
these = tr[6]
returns.append(these)
这包含各种各样的问题,但我相信你可以想象到。它给出了第一个 td
的值,重复次数与表中 tr
的数量相同。当我需要的最终结果是最后一个td
时。
非常感谢收到的任何帮助!我正在尝试为一个金融类项目执行此操作来学习 python,而不是手动输入值。
干杯!
最佳答案
我将使用帮助 strptime()
检查日期是否与 %b %d, %Y
格式匹配和异常处理。换句话说,遵循EAFP
principle .
来自 Scrapy Shell
的演示:
In [1]: from datetime import datetime
In [2]: rows = response.xpath('//table[@class="yfnc_datamodoutline1"]//table/tr')[1:]
In [3]: for row in rows:
cells = row.xpath('.//td/text()').extract()
try:
datetime.strptime(cells[0], "%b %d, %Y")
print cells[-1]
except ValueError:
continue
77.15
77.46
72.93
81.33
82.99
80.88
...
44.12
42.46
39.00
42.20
我还改进了 XPath 表达式,以更多地关注所需的表数据。
关于Python:If 语句和 Scrapy XPath 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29321869/