我正在尝试使用scrapy选择器从Web抓取数据表但是得到一个空数组。有趣的是,当我试图保存文件并刮掉它时,我得到了预期的数组(非空)。有关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
$ scrapy shell <url>
在返回空数组([])时运行选择器。如果我将html输出保存到文件(例如C:\ src.html)并使用选择器,我得到了预期的响应。
THX!
答案 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