一、Selector选择器介绍

python从网页中提取数据常用以下两种方法:

  • lxml:基于ElementTree的XML解析库(也可以解析HTML),不是python的标准库
  • BeautifulSoup:基于HTML代码的解析库, 对不良标记的处理非常合理,速度上有所欠缺

在scrapy中可以使用上述两种方法进行网页解析,但是scrapy本身也提供了一套提取数据的机制,即selector选择器,它通过特定的xpath或者CSS表达式来选择网页中的某个部分,Scrapy选择器构建 lxml 库之上。

在scrapy中内置了一个选择器类Selector,可以自己构建Selector对象,然后通过对象的xpath方法或css方法进行选择。

  • from scrapy.selector import Selector
  • s = Selector(text = doc)   #创建Selector对象
>>> from scrapy.selector import Selector
>>> p = '<p>I am a para</p>'
>>> s = Selector(text = p)
>>> s
<Selector xpath=None data='<html><body><p>I am a para</p></body>...'>
>>> s.xpath('//p')
[<Selector xpath='//p' data='<p>I am a para</p>'>]
>>> s.css('p::text')
[<Selector xpath='descendant-or-self::p/text()' data='I am a para'>]

但是实际爬虫工作中并不需要自己创建Selector对象,因为scrapy的爬取结果response中内置了Selector对象,可通过response.selector.xpath()和response.selector.css()进行选择。同时response也内置了xpath()方法和css()方法,因此可直接通过response.xpath()和response.css()进行选择。

从上述示例可以看出,通过xpath和css返回的直接结果为选择器列表,每个选择器都包含使用该语法的格式,因此需要在选择后再使用extract()和extract_first()去掉格式提取实际的网页内容,extract_first()相当于[0].extract()或者extract()[0]。

>>> s.xpath('//p').extract()
['<p>I am a para</p>']
>>> s.css('p::text').extract()
['I am a para']
>>> s.css('p::text').extract_first()
'I am a para'

二、通过xpath选择

xpath四种基本用法

response.xpath("//标签[@属性='属性值']").extract()    #返回匹配到的元素节点,结果为列表
response.xpath('//标签/text()').extract()                       #返回匹配到的元素节点的文本,结果为列表
response.xpath('//标签/@属性').extract()                    #返回匹配到的元素节点的属性值,结果为列表
response.xpath('//标签').re('匹配规则')         #对返回的结果通过正则表达式进行提取

以scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html进入shell进行演示。

1.选择标签

In [8]: response.xpath("//title")
Out[8]: [<Selector xpath='//title' data='<title>Example website</title>'>] In [9]: response.xpath("//a[@href='image2.html']")
Out[9]: [<Selector xpath="//a[@href='image2.html']" data='<a href="image2.html">Name: My image ...'>] In [10]: response.xpath("//a[@href='image2.html']").extract()
Out[10]: ['<a href="image2.html">Name: My image 2 <br><img src="data:image2_thumb.jpg"></a>']

不论匹配的结果有几个,使用extract()得到的都是一个列表,而使用extract_first()会将匹配到的第一个元素提取出来。由于extract()得到的结果为列表,因此可在xpath后的结果通过[0]选择第一个元素再extract()提取,也可以在extract()提取后再通过[0]选择第一个元素。

In [11]: response.xpath("//a").extract_first()
Out[11]: '<a href="image1.html">Name: My image 1 <br><img src="data:image1_thumb.jpg"></a>'
In [12]: response.xpath("//a")[0].extract()
Out[12]: '<a href="image1.html">Name: My image 1 <br><img src="data:image1_thumb.jpg"></a>'
In [13]: response.xpath("//a").extract()[0]
Out[13]: '<a href="image1.html">Name: My image 1 <br><img src="data:image1_thumb.jpg"></a>'

extract()和extract_first()还可以使用参数default='***',表示结果为空时的返回值

In [20]: response.xpath("//titll").extract_first(default='None return')
Out[20]: 'None return'

2.选择标签的文本

In [23]: response.xpath("//title/text()").extract_first()
Out[23]: 'Example website'

3.选择标签的属性值

In [25]: response.xpath("//a[@href='image3.html']/img/@src").extract_first()
Out[25]: 'image3_thumb.jpg'

4.xpath选择后的正则匹配

In [92]: response.xpath('//a/text()').re('Name:(.*)')
Out[92]:
[' My image 1 ',
' My image 2 ',
' My image 3 ',
' My image 4 ',
' My image 5 ']

三、通过css选择

css四种基本用法

response.css("标签[属性='属性值']").extract() #返回匹配到的元素节点,结果为列表
response.css("标签::text").extract() #返回匹配到的元素节点的文本,结果为列表
response.css("标签::attr(属性)") .extract() #返回匹配到的元素节点的属性值,结果为列表
response.css("标签").re('匹配规则') #对返回的结果通过正则表达式进行提取

1.选择标签

In [26]: response.css('title')
Out[26]: [<Selector xpath='descendant-or-self::title' data='<title>Example website</title>'>]
In [27]: response.css("a[href='image2.html']")
Out[27]: [<Selector xpath="descendant-or-self::a[@href = 'image2.html']" data='<a href="image2.html">Name: My image ...'>]
In [28]: response.css("a[href='image2.html']").extract_first()
Out[28]: '<a href="image2.html">Name: My image 2 <br><img src="data:image2_thumb.jpg"></a>'

2.选择标签的文本

In [51]: response.css("title::text").extract_first()
Out[51]: 'Example website'

3.选择标签的属性值

In [52]: response.css("a[href='image3.html']").css("img::attr(src)").extract_first()
Out[52]: 'image3_thumb.jpg'

4.css选择后的正则匹配

In [93]: response.css('a::attr(href)').re('(.*).html')
Out[93]: ['image1', 'image2', 'image3', 'image4', 'image5']

scrapy中选择器用法的更多相关文章

  1. 三、Scrapy中选择器用法

    官方示例源码<html> <head>  <base href='http://example.com/' />  <title>Example web ...

  2. Scrapy中选择器的用法

    官方文档:https://doc.scrapy.org/en/latest/topics/selectors.html Using selectors Constructing selectors R ...

  3. Scrapy框架中选择器的用法【转】

    Python爬虫从入门到放弃(十四)之 Scrapy框架中选择器的用法 请给作者点赞 --> 原文链接 Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpa ...

  4. scrapy框架中选择器的用法

    scrapy框架中选择器的用法 Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中 ...

  5. 使用scrapy中xpath选择器的一个坑点

    情景如下: 一个网页下有一个ul,这个ur下有125个li标签,每个li标签下有我们想要的 url 字段(每个 url 是唯一的)和 price 字段,我们现在要访问每个li下的url并在生成的请求中 ...

  6. 不可不看!CSS3中三十一种选择器用法

    原文 The 30 CSS Selectors you Must Memorize 由 Jeffrey Way 发表于 2012 年 6 月,介绍了 30 种最常用的 CSS 选择器用法,多加了一种, ...

  7. scrapy框架中Spiders用法

    scrapy框架中Spiders用法 Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据 总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以 ...

  8. 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)

    前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ...

  9. Scrapy Selectors 选择器

    0. 1.参考 <用Python写网络爬虫>——2.2 三种网页抓取方法  re / lxml / BeautifulSoup 需要注意的是,lxml在内部实现中,实际上是将CSS选择器转 ...

随机推荐

  1. Docker入门(1):概述

    1.摘要 在这篇文章中,我将介绍一下为什么需要虚拟化的环境. 然后我将介绍耳熟能详的虚拟化技术:虚拟机,并大致的介绍一下虚拟机的原理,希望能够让你知道虚拟机的优劣. 在之后,针对虚拟机存在的问题,引出 ...

  2. js语法基础入门(2)

    2.变量 2.1.变量的声明 声明变量的时候没有赋值,默认输出undefined //通过var 声明一个变量 var user: //默认输出undefined 可以同时声明多个变量 var use ...

  3. 用JQuery解析获取JSON数据

    JSON 是一种比较方便的数据形式,下面使用$.getJSON方法,实现获得JSON数据和解析,都挺方便简单的.从http://api.flickr.com/services/feeds/photos ...

  4. spring引用hibernate映射文件的四种方式

    1.mappingResources 2.mappingLocations 3.mappingDirectoryLocations 4.mappingJarLocations 四种方式:https:/ ...

  5. 【2003、2004 NOIp 入门组错题报告】

    2003: T4: 题目大意:  讲这么多话,其实就是求比当前序列大的序列中第m小的一个.可以每次找出比当前序列大的最小的一个序列.我们可以从后往前扫描,当当前这个数比后一个数小时,我们把它与它后面的 ...

  6. Tallest Cow,题解

    题目链接 题意: 问满足一系列形如ab可以相互看到的约束的所有奶牛的最大身高(最高的编号和高度已给出) 分析: 首先,这个可以互相看到指的是中间的人比两头的都矮,一条斜线看到的不行,那么其实我们就可以 ...

  7. docker自动化部署前端项目实战一

    docker自动化部署前端项目实战一 本文适用于个人项目,如博客.静态文档,不涉及后台数据交互,以部署文档为例. 思路 利用服务器node脚本,监听github仓库webhook push事件触发po ...

  8. day22 常用模块(上)

    一.时间模块 1 time模块 获取时间的三种格式: 第一种:time.time() 时间戳(timestamp):从1970年到现在的秒数 #应用场景:计算时间差 可以对时间加减,返回值为浮点型 p ...

  9. Spring Boot 2.x基础教程:事务管理入门

    什么是事务? 我们在开发企业应用时,通常业务人员的一个操作实际上是对数据库读写的多步操作的结合.由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻 ...

  10. Scala 面向对象(四):import

    1 Scala引入包基本介绍 Scala引入包也是使用import, 基本的原理和机制和Java一样,但是Scala中的import功能更加强大,也更灵活. 因为Scala语言源自于Java,所以ja ...