Python:If 语句和 Scrapy XPath 选择器

标签 python xpath web-scraping scrapy

我正在尝试选择表的最后一列中包含的值: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/

相关文章:

sql-server - 如何在sql中为xml的所有子节点添加属性

python - 使用 BS4 获取属性名称而不是值

javascript - 如何在不使用任何 api 的情况下从 LinkedIn 抓取数据

python - 是否有适用于 Python 的标准词法分析器/解析器工具?

包/模块之间的python变量共享

python - Pandas DataFrame 序列化

python - 网络抓取具有通过ajax加载的动态内容的网页

python - Cerberus 模式验证依赖取决于自身值(value)

regex - 在 XSLT/XQuery 正则表达式中,对交替表达式的求值是否有要求的顺序?

php - xpath 排除具有类的元素