1

我正在尝试使用 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

用于连接网络的 Shell 命令

$ scrapy shell <url>

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

谢谢!

4

1 回答 1

2

我了解您想从第二列中获取单元格,即标题为“SALES”的单元格

我真的不知道您的contains(@headers,"tbl\x34\x37a")谓词来自哪里,我认为这可能是由于为td.

我建议你试试这个相当奇怪的 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来确定元素的位置

说明:

  • 首先找到第一个表:在包含的adivdiv,包含span带有“INCOME STATEMENT”的a...
  • 然后找到td单元格,该单元格position()与其表兄弟单元格的位置相同th,值为“SALES”
  • ../../..是从tdback to grand-grand-parent table,这可以简化为ancestor::table[1](第一table祖先)

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

hxs.select("""
    //div[div[contains(span, "INCOME STATEMENT")]]
        //table[contains(@class,"mnytbl")]/tbody/tr
           /td[
               position() = (
                       count(ancestor::table[1]
                                 /thead/tr/th[contains(., "SALES")]
                                          /preceding-sibling::th)
                       + 1
                   )
               ]/span/text()
""").extract()
于 2013-09-23T21:30:52.857 回答