所以我正在通过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之间存在这样的差异。
答案 0 :(得分:4)
尝试.//
代替//
进行相关搜索,例如:
print quote.xpath(".//*[@class='text']/text()").extract()
当您使用//
时,虽然您要从quote
进行搜索,但这意味着绝对搜索,因此其上下文仍然是文档的根。 .//
但是,意味着从.
- 当前节点进行搜索 - 此搜索的上下文将仅限于嵌套在quote
下的元素。
作为旁注,如果您希望获得完全相同的结果,则应考虑将*
更改为您在CSS搜索中使用的代码 - span
或div
。在这种情况下,它没有任何区别,只是为了将来的参考。
答案 1 :(得分:0)
当您使用//时,它将从响应中获得所有结果。如果你使用.//那么它的范围将仅限于那个选择器。请尝试.//
而不是//
。它将解决您的问题: - )