美文网首页
scrapy提取数据之:xpath选择器

scrapy提取数据之:xpath选择器

作者: 中v中 | 来源:发表于2022-07-30 10:20 被阅读0次

    简介:

    scrapy提取数据最常用的是css选择器,今天学习一下xpath选择器;反正技多不压身。

    简单说,xpath就是选择XML文件中节点的方法。
    所谓节点node,就是XML文件的最小构成单位,一共分成7种

    - element(元素节点)
    - attribute(属性节点)
    - text (文本节点)
    - namespace (名称空间节点)
    - processing-instruction (处理命令节点)
    - comment (注释节点)
    - root (根节点)
    

    最常见就是element(元素节点),所以下面只涉及元素节点的提取
    格式

    xpath表达式的基本格式

    #xpath通过"路径表达式"(Path Expression)来选择节点。
    #在形式上,"路径表达式"与传统的文件系统非常类似。
    

    表达式 描述
    nodename 选取此节点的所有子节点。
    / 从根节点选取。
    // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
    . 选取当前节点。
    .. 选取当前节点的父节点。
    @ 选取属性。

    选择节点的基本规则
    
    - nodename(节点名称):表示选择该节点的所有子节点
    
    - "/":表示选择根节点
    
    - "//":表示选择任意位置的某个节点
    
    - "@": 表示选择某个属性
    

    了解3个方面:

    一、属性提取;
    二、内容提取;
    三、标签内包含标签又包含标签的最外层标签里的所有内容提取
    一、scrapy xpath 属性提取

    目标网址:http://lab.scrapyd.cn/
    假设我们需要如图的href地址

    图片.png

    ①启动scrapy数据提取的调试工具
    scrapy shell http://lab.scrapyd.cn/

    图片.png

    ②介绍一下命令
    response.xpath("//ol[@class='page-navigator']//@href")
    其中//表示从任意元素节点出发,我们这个选择的ol节点,但是文档那么多ol节点,选择哪一个?,我们观察图上文档,这个ol节点有个class=page-navigator,所以这个是它的一个属性,我们使用@class='page-navigator'选择带有这个属性的ol的节点,然后选择好了节点我们需要提取改节点下的信息,我们需要的是href,所以加上@href。我们先来看看运行效果


    图片.png

    使用extract()提取纯粹的href,然后在选择第二个
    response.xpath("//ol[@class='page-navigator']//@href").extract()[1]


    图片.png

    二、scrapy xpath 内容提取,表达式: //text()

    我们需要下图的内容


    图片.png

    分析:它是属于quote的,但是quote不是唯一,有很多,所以向上找到container或者row

    response.xpath("//div[@class='container']//div[@class='quote post'][1]//span[@class='text']//text()").extract()
    
    注意了 
    div[@class='quote post']一定要加上post 把这个class 写完
    
    图片.png
    图片.png

    三、标签内包含标签又包含标签的最外层标签里的所有内容提取

    表达式 string()


    图片.png

    response.xpath("string(//div[@class='container']//div[@class='quote post'][1])").extract()


    图片.png

    四、xpath实例
    路径表达式 结果
    /bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
    /bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
    /bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
    /bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
    //title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
    //title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
    /bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
    /bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

    bookstore 选取 bookstore 元素的所有子节点。
    /bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
    bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
    //book 选取所有 book 子元素,而不管它们在文档中的位置。
    bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
    //@lang 选取名为 lang 的所有属性。

    • 匹配任何元素节点。
      @* 匹配任何属性节点。
      node() 匹配任何类型的节点。
      /bookstore/* 选取 bookstore 元素的所有子元素。
      //* 选取文档中的所有元素。
      //title[@*] 选取所有带有属性的 title 元素。

    参考文章:http://www.scrapyd.cn/doc/186.html

    相关文章

      网友评论

          本文标题:scrapy提取数据之:xpath选择器

          本文链接:https://www.haomeiwen.com/subject/ajvcwrtx.html