当解析url时,scrapy选择器返回null,但在解析保存的url时返回ok
我试图使用scrapy选择器从web上刮取数据表,但得到了一个空数组。有趣的是,当我试图保存文件并刮取它时,我得到了预期的数组(非空)。下面可以找到有关Scrapy版本、选择器命令和预期响应的信息 刮擦版 选择器 预期反应当解析url时,scrapy选择器返回null,但在解析保存的url时返回ok,url,xpath,scrapy,web-crawler,Url,Xpath,Scrapy,Web Crawler,我试图使用scrapy选择器从web上刮取数据表,但得到了一个空数组。有趣的是,当我试图保存文件并刮取它时,我得到了预期的数组(非空)。下面可以找到有关Scrapy版本、选择器命令和预期响应的信息 刮擦版 选择器 预期反应 [u'\n1.26 Bil\n\n',u'\n893.90 Mil\n\n',u'\n924.87 Mil\n \n',u'\n1.18比尔\n\n',u'\n1.55比尔\n\n',u'\n2.91比尔\n \n',u'\n3.96比尔\n\n',u'\n4.01比尔\n\
[u'\n1.26 Bil\n\n',u'\n893.90 Mil\n\n',u'\n924.87 Mil\n
\n',u'\n1.18比尔\n\n',u'\n1.55比尔\n\n',u'\n2.91比尔\n
\n',u'\n3.96比尔\n\n',u'\n4.01比尔\n\n',u'\n3.35比尔\n
\n',u'\n2.36比尔\n\n']
: http://investing.money.msn.com/investments/financial-statements?symbol=SPF
连接到web的Shell命令
$scrapy shell
在返回空数组([])时运行选择器。如果我将html输出保存到一个文件(例如C:\src.html)并使用选择器,我会得到预期的响应
谢谢 我知道您想从第二列中获取单元格,即标题为“SALES”的列 我真的不知道您的
包含(@headers,“tbl\x34\x37a”)
谓词来自哪里,我认为这可能是由于td
动态生成的“header”属性造成的
我建议您尝试使用这个相当粗糙的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
)
]
这将借用来确定元素的位置
说明:
- 首先查找第一个表:在包含
的div
中,包含带有“损益表”的div
span
- 然后找到
单元格,该单元格的td
与其近亲position()
单元格的位置相同,值为“SALES”th
。/../../code>是从
返回到祖父母td
,这可以通过表
来简化(第一个祖先::表[1]
祖先)表
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()
很高兴听到,@user1723988!如果你对答案满意,你可以接受,谢谢。
[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>
//div[div[contains(span, "INCOME STATEMENT")]]
//table[contains(@class,"mnytbl")]/tbody/tr
/td[
position() = (
count(../../../thead/tr/th[contains(., "SALES")]
/preceding-sibling::th)
+ 1
)
]
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()