zoukankan      html  css  js  c++  java
  • python爬虫之Scrapy框架中的选择器

    选择器

    Scrapy提取数据有自己的一套机制, 被称作为选择器(selectors), 通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分

    Xpath是专门在XML文件中选择节点的语言, 也可由用在HTML.

    CSS是一门将HTML文档样式化语言, 选择器由它定义, 并与特定的HTML元素的样式相关联.

    XPath选择器 : 

      常用的路径表达式, XPath的功能非常强大, 内含超过100个内建函数.

    nodeName    选取此节点的所有节点
    /           从根节点选取
    //          从匹配选择的当前节点选择文档中的节点,不考虑它们的位置
    .           选择当前节点
    ..          选取当前节点的父节点
    @           选取属性
    *           匹配任何元素节点
    @*          匹配任何属性节点
    Node()      匹配任何类型的节点

    CSS选择器 :

      CSS层叠样式表, 语法两个主要部分组成: 选择器, 一条或多条声明

      Selector{declaration1; declaration2; ...}

    .class              .color              选择class=”color”的所有元素
    #id                 #info               选择id=”info”的所有元素
    *                   *                   选择所有元素
    element             p                   选择所有的p元素
    element,element     div,p               选择所有div元素和所有p元素
    element element     div p               选择div标签内部的所有p元素
    [attribute]         [target]            选择带有targe属性的所有元素
    [arrtibute=value]   [target=_blank]     选择target=”_blank”的所有元素

    选择器的使用例子 :

        <html>
         <head>
          <base href='http://example.com/' />
          <title>Example website</title>
         </head>
         <body>
          <div id='images'>
           <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
           <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
           <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
           <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
           <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
          </div>
         </body>
        </html>

    获取title:

      extract_first()可以获取title标签内的文本内容, 因为第一个通过xpath返回的结果是一个列表, 所以通过extract()之后返回的也是一个列表, 而extract_filst()可以直接返回第一个值, 

      extract_filst()有一个参数default, 例如: extract_filst(default="")表示如果匹配不到返回一个空.

    In [1]: response.xpath('//title/text()')
    Out[1]: [<Selector xpath='//title/text()' data='Example website'>]
    
    In [2]: response.xpath('//title/text()').extract_first()
    Out[2]: 'Example website'
    
    In [6]: response.xpath('//title/text()').extract()
    Out[6]: ['Example website']

    同样给也可以通过css选择器获取:

    In [7]: response.css('title::text')
    Out[7]: [<Selector xpath='descendant-or-self::title/text()' data='Example website'>]
    
    In [8]: response.css('title::text').extract_first()
    Out[8]: 'Example website'

    查看图片信息:

      通过xpath和css结合使用获取图片的src地址:

    In [13]: response.xpath('//div[@id="images"]').css('img')
    Out[13]: 
    [<Selector xpath='descendant-or-self::img' data='<img src="image1_thumb.jpg">'>,
     <Selector xpath='descendant-or-self::img' data='<img src="image2_thumb.jpg">'>,
     <Selector xpath='descendant-or-self::img' data='<img src="image3_thumb.jpg">'>,
     <Selector xpath='descendant-or-self::img' data='<img src="image4_thumb.jpg">'>,
     <Selector xpath='descendant-or-self::img' data='<img src="image5_thumb.jpg">'>]
    
    In [14]: response.xpath('//div[@id="images"]').css('img::attr(src)').extract()
    Out[14]: 
    ['image1_thumb.jpg',
     'image2_thumb.jpg',
     'image3_thumb.jpg',
     'image4_thumb.jpg',
     'image5_thumb.jpg']

    查找a标签信息:

      分别通过xpath和css选择器获取a标签的href内容, 以及文本信息, css获取属性信息是通过attr,xpath是通过@属性名

    In [15]: response.xpath('//a/@href')
    Out[15]: 
    [<Selector xpath='//a/@href' data='image1.html'>,
     <Selector xpath='//a/@href' data='image2.html'>,
     <Selector xpath='//a/@href' data='image3.html'>,
     <Selector xpath='//a/@href' data='image4.html'>,
     <Selector xpath='//a/@href' data='image5.html'>]
    
    In [16]: response.xpath('//a/@href').extract()
    Out[16]: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
    
    In [17]: response.css('a::attr(href)')
    Out[17]: 
    [<Selector xpath='descendant-or-self::a/@href' data='image1.html'>,
     <Selector xpath='descendant-or-self::a/@href' data='image2.html'>,
     <Selector xpath='descendant-or-self::a/@href' data='image3.html'>,
     <Selector xpath='descendant-or-self::a/@href' data='image4.html'>,
     <Selector xpath='descendant-or-self::a/@href' data='image5.html'>]
    
    In [18]: response.css('a::attr(href)').extract()
    Out[18]: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
    
    In [27]: response.css('a::text').extract()
    Out[27]: 
    ['Name: My image 1 ',
     'Name: My image 2 ',
     'Name: My image 3 ',
     'Name: My image 4 ',
     'Name: My image 5 ']
    
    In [28]: response.xpath('//a/text()').extract()
    Out[28]: 
    ['Name: My image 1 ',
     'Name: My image 2 ',
     'Name: My image 3 ',
     'Name: My image 4 ',
     'Name: My image 5 ']

    高级用法:

      查找属性名称包含img的所以的超链接, 通过contains实现:

    In [36]: response.xpath('//a[contains(@href,"image")]/@href').extract()
    Out[36]: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
    
    In [37]: response.css('a[href*=image]::attr(href)').extract()
    Out[37]: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

      查找img的src属性:

    In [41]: response.xpath('//a[contains(@href,"image")]/img/@src').extract()
    Out[41]: 
    ['image1_thumb.jpg',
     'image2_thumb.jpg',
     'image3_thumb.jpg',
     'image4_thumb.jpg',
     'image5_thumb.jpg']
    
    In [42]: response.css('a[href*=image] img::attr(src)').extract()
    Out[42]: 
    ['image1_thumb.jpg',
     'image2_thumb.jpg',
     'image3_thumb.jpg',
     'image4_thumb.jpg',
     'image5_thumb.jpg']

      提取a标签的文本中name后面的内容:

    In [43]: response.css('a::text').re('Name:(.*)')
    Out[43]: 
    [' My image 1 ',
     ' My image 2 ',
     ' My image 3 ',
     ' My image 4 ',
     ' My image 5 ']
    
    In [44]: response.css('a::text').re_first('Name:(.*)')
    Out[44]: ' My image 1 '
  • 相关阅读:
    leetcode108 Convert Sorted Array to Binary Search Tree
    leetcode98 Validate Binary Search Tree
    leetcode103 Binary Tree Zigzag Level Order Traversal
    leetcode116 Populating Next Right Pointers in Each Node
    Python全栈之路Day15
    Python全栈之路Day11
    集群监控
    Python全栈之路Day10
    自动部署反向代理、web、nfs
    5.Scss的插值
  • 原文地址:https://www.cnblogs.com/dong-/p/10305291.html
Copyright © 2011-2022 走看看