Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当解析url时,scrapy选择器返回null,但在解析保存的url时返回ok_Url_Xpath_Scrapy_Web Crawler - Fatal编程技术网

当解析url时,scrapy选择器返回null,但在解析保存的url时返回ok

当解析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\

我试图使用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\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()
    与其近亲
    th
    单元格的位置相同,值为“SALES”
  • 。/../../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()