response.xpath 和 response.css 有什么区别

Yan*_*ang 2 python scrapy

我尝试使用以下站点学习 response.xpath 和 response.css:http : //quotes.toscrape.com/

scrapy shell 'http://quotes.toscrape.com'
for quote in response.css("div.quote"):
    title = quote.css("span.text::text").extract()
Run Code Online (Sandbox Code Playgroud)

这只会得到一个值。但如果我使用 xpath:

scrapy shell 'http://quotes.toscrape.com'
    for quote in response.css("div.quote"):
    title = quote.xpath('//*[@class="text"]/text()').extract()
Run Code Online (Sandbox Code Playgroud)

它将获得整个页面上所有标题的列表。

有人可以告诉我使用这两种工具有什么不同吗?有些元素我比较喜欢用response.xpath,比如具体的表格内容,follow-sibling很容易获取,但是response.css无法获取

gmo*_*lau 7

有关 XPath 和 CSS 之间差异的一般说明,请参阅Scrapy 文档

Scrapy 有自己的数据提取机制。它们被称为选择器,因为它们“选择”由 XPath 或 CSS 表达式指定的 HTML 文档的某些部分。

XPath 是一种在 XML 文档中选择节点的语言,它也可以与 HTML 一起使用。CSS 是一种将样式应用于 HTML 文档的语言。它定义了选择器以将这些样式与特定的 HTML 元素相关联。

XPath 提供了比纯 CSS 选择更多的功能(维基百科文章提供了一个很好的概述),代价是更难学习。Scrapy 在内部将 CSS 选择器转换为 XPath,因此该.css()功能基本上是语法糖.xpath(),您可以使用您觉得更舒服的任何一个。

关于您的具体示例,我认为问题在于您的 XPath 查询实际上并不相对于前一个选择器(引用 div),而是相对于整个文档。请参阅Scrapy 文档中“使用相对 XPaths”中的引用:

请记住,如果您正在嵌套选择器并使用以 / 开头的 XPath,则该 XPath 将是文档的绝对路径,而不是相对于您从中调用它的选择器。

要获得与 CSS 选择器相同的结果,您可以使用类似这样的方法,其中 XPath 查询是相对于引用 div 的:

for quote in response.css('div.quote'):
    print(quote.xpath('span[@class="text"]/text()').extract())
Run Code Online (Sandbox Code Playgroud)

请注意,XPath 还具有对当前节点进行任何查询的.表达式,但我不确定 Scrapy 如何实现这一点(使用'.//*[@class="text"]/text()'也能给出你想要的结果)。