【问题标题】:what is the difference response.xpath and response.cssresponse.xpath 和 response.css 有什么区别
【发布时间】:2018-06-02 12:53:42
【问题描述】:

我尝试使用以下站点学习 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()

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

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

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

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

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

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

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

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

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

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

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

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

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

    请注意,XPath 也有 . expression 来进行与当前节点相关的任何查询,但我不确定 Scrapy 是如何实现这一点的(使用 './/*[@class="text"]/text()' 也可以得到你想要的结果)。

    【讨论】:

    • "(使用 './/*[@class="text"]/text()' 也会给出你想要的结果)。" - 这救了我一整晚?谢谢
    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    相关资源
    最近更新 更多