scrapy

时间:2016-10-02 17:48:10

标签: python xpath css-selectors scrapy

所以我正在通过tutorial玩scrapy。我试图在companion website中删除每个引用的文本,作者和标签 当使用那里提到的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()

我得到重复的结果!

我仍然无法找到为什么2之间存在这样的差异。

2 个答案:

答案 0 :(得分:4)

尝试.//代替//进行相关搜索,例如:

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

当您使用//时,虽然您要从quote进行搜索,但这意味着绝对搜索,因此其上下文仍然是文档的根。 .//但是,意味着从. - 当前节点进行搜索 - 此搜索的上下文将仅限于嵌套在quote下的元素。

作为旁注,如果您希望获得完全相同的结果,则应考虑将*更改为您在CSS搜索中使用的代码 - spandiv 。在这种情况下,它没有任何区别,只是为了将来的参考。

答案 1 :(得分:0)

当您使用//时,它将从响应中获得所有结果。如果你使用.//那么它的范围将仅限于那个选择器。请尝试.//而不是//。它将解决您的问题: - )