scrapy选择器在解析url时返回null,但在解析已保存的url时确定

时间:2013-09-23 20:15:47

标签: url xpath scrapy web-crawler

我正在尝试使用scrapy选择器从Web抓取数据表但是得到一个空数组。有趣的是,当我试图保存文件并刮掉它时,我得到了预期的数组(非空)。有关Scrapy版本,选择器命令和预期响应的信息,请参见下文。

Scrapy版本

Scrapy  : 0.18.2
lxml    : 3.2.3.0
libxml2 : 2.9.0
Twisted : 13.1.0
Python  : 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]
Platform: Windows-8-6.2.9200

选择

hxs.select('//table[contains(@class,"mnytbl")]//tbody//td[contains(@headers,"tbl\x34\x37a")]//span/text()').extract()

预期回复

[u'\n1.26 Bil\n        \n', u'\n893.90 Mil\n        \n', u'\n924.87 Mil\n
 \n', u'\n1.18 Bil\n        \n', u'\n1.55 Bil\n        \n', u'\n2.91 Bil\n
  \n', u'\n3.96 Bil\n        \n', u'\n4.01 Bil\n        \n', u'\n3.35 Bil\n
   \n', u'\n2.36 Bil\n        \n']

<url>: http://investing.money.msn.com/investments/financial-statements?symbol=SPF

用于连接到Web的Shell命令

$ scrapy shell <url>

在返回空数组([])时运行选择器。如果我将html输出保存到文件(例如C:\ src.html)并使用选择器,我得到了预期的响应。

THX!

1 个答案:

答案 0 :(得分:2)

我知道你想从第二列获取单元格,标题为“SALES”的单元格

我真的不知道contains(@headers,"tbl\x34\x37a")谓词的来源,我认为这可能是由td动态生成的“标题”属性造成的。

我建议你试试这个相当scrary的XPath表达式

    //div[div[contains(span, "INCOME STATEMENT")]]
        //table[contains(@class,"mnytbl")]/tbody/tr
           /td[
               position() = (
                       count(../../../thead/tr/th[contains(., "SALES")]
                                        /preceding-sibling::th)
                       + 1
                   )
               ]

借用Find position of a node using xpath来确定元素的位置

说明:

  • 首先找到第一个表:在包含div的{​​{1}}内,其中包含带有“收入声明”的div ...
  • 然后找到span单元格,td与其表兄position()单元格的位置相同,其值为“SALES”
  • th将从../../..返回到祖父母td,这可以通过table(第一个ancestor::table[1]祖先)来简化< / LI>

因此,要在第一个表的每一行的每个第二个单元格中获取跨度内的文本元素,那将是:

table