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
Python Xpath中的重复结果,而不是scrapy中的CSS选择器_Python_Xpath_Css Selectors_Scrapy - Fatal编程技术网

Python Xpath中的重复结果,而不是scrapy中的CSS选择器

Python Xpath中的重复结果,而不是scrapy中的CSS选择器,python,xpath,css-selectors,scrapy,Python,Xpath,Css Selectors,Scrapy,所以我和scrapy一起玩了很久。我正试图刮文本,作者和标签的每一个引用中 使用CSS选择器时,如上文所述: for quote in response.css('div.quote'): print quote.css('span.text::text').extract() print quote.css('span small::text').extract() print quote.css('div.tags a.tag::text').extract() 我

所以我和scrapy一起玩了很久。我正试图刮文本,作者和标签的每一个引用中 使用CSS选择器时,如上文所述:

for quote in response.css('div.quote'):
    print quote.css('span.text::text').extract()
    print quote.css('span small::text').extract()
    print quote.css('div.tags a.tag::text').extract()
我得到了期望的结果(即:打印每一篇文章、作者和引用一次)。 但一旦使用Xpath选择器,如下所示:

for quote in response.xpath("//*[@class='quote']"):
    print quote.xpath("//*[@class='text']/text()").extract()
    print quote.xpath("//*[@class='author']/text()").extract()
    print quote.xpath("//*[@class='tag']/text()").extract()
我得到了重复的结果


我仍然找不到为什么这两种方法之间会有如此大的差异。

尝试
/
而不是
/
进行相对搜索,例如

print quote.xpath(“./*[@class='text']/text()”).extract()

当您使用
/
时,尽管您是从
中进行搜索,但这意味着绝对搜索,因此其上下文仍然是文档的根
/
但是,这意味着从
当前节点进行搜索,并且此搜索的上下文将限于嵌套在
quote
下的元素


作为一个旁注,如果你想得到完全相同的结果,你应该考虑将<代码> */COD>更改为CSS搜索中使用的标记-<代码> SUP或<代码> DIV。在这种情况下,它没有任何区别,只是一个头部的未来参考。

尝试
/
而不是
/
为您的相对搜索,例如

print quote.xpath(“./*[@class='text']/text()”).extract()

当您使用
/
时,尽管您是从
中进行搜索,但这意味着绝对搜索,因此其上下文仍然是文档的根
/
但是,这意味着从
当前节点进行搜索,并且此搜索的上下文将限于嵌套在
quote
下的元素


作为一个旁注,如果你想得到完全相同的结果,你应该考虑将<代码> */COD>更改为CSS搜索中使用的标记-<代码> SUP或<代码> DIV。在这种情况下,它没有任何区别,只是一个头部,供将来参考。

当您使用//时,它将从响应中获得所有结果。如果使用//则它的作用域将限于该选择器。尝试
/
而不是
/
。它将解决您的问题:-)

当您使用//时,它将从响应中获得所有结果。如果使用//则它的作用域将限于该选择器。尝试
/
而不是
/
。它将解决您的问题:-)

抓得好,不知道
/
的事情!接得好,我不知道
/
这件事!