大部分人可能喜欢使用以下三个解析器对网页进行解析:

BeautifulSoup:使用方便,支css选择器,但它有个不可忽视的缺点:慢。

lxml解析库:采用xpath解析,速度快。

pyquery:它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器

re:正则表达式是万能通用的,不过使用它的头疼度我就不用过多解释了。。

但对于某些网页结构俩说,单一的解析方法也许并不是那么方便,如果想嵌套xpath与css选择器甚至正则表达式呢?

好的,你需要了解学习一下强大的Selector选择器,它不仅是能在scrapy框架内部使用,也可导入到其他脚本爬虫中。

而且这更适合经常使用scrapy框架的人的解析习惯。

这里着重介绍在外部使用Selector的方法,(scrapy内部使用无需先实例化,其余操作均相同):

1.导入scrapy,实例化对象

首先导入包,传入网页响应实例化Selector的对象,使用xpath或css解析器解析网页:

from scrapy import Selector

body = '

good'

selector = Selector(text=body)

>>> selector.xpath('//span/text()').get()

'good'

>>> selector.css('span::text').get()

'good'

2.提取文本数据,

必须调用选择器.get() 或.getall()方法,如下所示:

from scrapy import Selector

body ="""

Example website

Name: My image 1

Name: My image 2

Name: My image 3

Name: My image 4

Name: My image 5

"""

>>>selector = Selector(text=body)

>>>selector.xpath('//title/text()').getall()

['Example website']

>>>selector.xpath('//title/text()').get()

'Example website'

.get()总是返回一个结果; 如果有多个匹配,则返回第一个匹配的内容; 如果没有匹配项,则返回None。.getall()返回包含所有结果的列表。

请注意,CSS选择器可以使用CSS3伪元素选择文本或属性节点:

>>> selector.css('title::text').get()

'Example website'

3.选择器返回对象格式

正如你所看到的,.xpath()和.css()方法返回一个 SelectorList实例,这是新的选择列表。此API可用于快速选择嵌套数据:

>>> selector.css('img').xpath('@src').getall()

['image1_thumb.jpg',

'image2_thumb.jpg',

'image3_thumb.jpg',

'image4_thumb.jpg',

'image5_thumb.jpg']

如果只想提取第一个匹配的元素,可以调用选择器.get()(或.extract_first()这是以前版本的方法):

>>> selector.xpath('//div[@id="images"]/a/text()').get()

'Name: My image 1 '

4.返回None

如果解析式没有找到元素,则返回:None:

>>> selector.xpath('//div[@id="not-exists"]/text()').get() is None

True

当你不希望返回的数据是None时,可以提供默认返回值作为参数,以代替None:

>>> selector.xpath('//div[@id="not-exists"]/text()').get(default='not-found')

'not-found'

5.css选择器的.attrib

可以使用css选择器的.attrib而非xpath的@src采取列表推导式来获取网页结构某属性值:

>>> [img.attrib['src'] for img in selector.css('img')]

['image1_thumb.jpg',

'image2_thumb.jpg',

'image3_thumb.jpg',

'image4_thumb.jpg',

'image5_thumb.jpg']

作为快捷方式,.attrib也可以直接在SelectorList上使用; 它返回第一个匹配元素的属性,当仅预期单个结果时,例如当通过id选择或在网页上选择唯一元素时,这是最有用的::

>>> selector.css('img').attrib['src']

'image1_thumb.jpg'

6.常用链接提取示例

现在我们将获得基本URL和一些图像链接:

>>> selector.xpath('//base/@href').get()

'http://example.com/'

>>> selector.css('base::attr(href)').get()

'http://example.com/'

>>> selector.css('base').attrib['href']

'http://example.com/'

>>> selector.xpath('//a[contains(@href, "image")]/@href').getall()

['image1.html',

'image2.html',

'image3.html',

'image4.html',

'image5.html']

>>> selector.css('a[href*=image]::attr(href)').getall()

['image1.html',

'image2.html',

'image3.html',

'image4.html',

'image5.html']

>>>selector.xpath('//a[contains(@href, "image")]/img/@src').getall()

['image1_thumb.jpg',

'image2_thumb.jpg',

'image3_thumb.jpg',

'image4_thumb.jpg',

'image5_thumb.jpg']

>>>selector.css('a[href*=image] img::attr(src)').getall()

['image1_thumb.jpg',

'image2_thumb.jpg',

'image3_thumb.jpg',

'image4_thumb.jpg',

'image5_thumb.jpg']

7.CSS选择器的扩展:Selector支持一些w3c标准的拓展

要选择文本节点,请使用 ::text

选择属性值,用::attr(name)那里的名字是你想要的价值属性的名称

8.嵌套选择器

当解析后不调用.get()或.getall()方法时,将会返回一个选择器列表,我们可在后续继续对该对象进行选择器的嵌套调用:

>>> links = selector.xpath('//a[contains(@href, "image")]')

>>> links.getall()

['Name: My image 1 ',

'Name: My image 2 ',

'Name: My image 3 ',

'Name: My image 4 ',

'Name: My image 5 ']

>>> for index, link in enumerate(links):

... args = (index, link.xpath('@href').get(), link.xpath('img/@src').get())

... print('Link number %d points to url %r and image %r' % args)

Link number 0 points to url 'image1.html' and image 'image1_thumb.jpg'

Link number 1 points to url 'image2.html' and image 'image2_thumb.jpg'

Link number 2 points to url 'image3.html' and image 'image3_thumb.jpg'

Link number 3 points to url 'image4.html' and image 'image4_thumb.jpg'

Link number 4 points to url 'image5.html' and image 'image5_thumb.jpg'

9.使用正则表达式选择器

Selector还有一种.re()使用正则表达式提取数据的方法。但是,与使用 .xpath()或.css()methods 不同,.re()返回unicode字符串列表。所以你不能构造嵌套的.re()调用。

以下是用于从上面的[HTML代码中提取图像名称的示例:

>>> selector.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

['My image 1',

'My image 2',

'My image 3',

'My image 4',

'My image 5']

使用.re_first()提取第一个匹配的字符串:

>>> selector.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')

'My image 1'

10.关于extract()和extract_first()的使用

Scrapy仍然支持这些方法,没有计划弃用它们。Scrapy使用文档现在使用.get()和 .getall()方法编写,你可以随自己喜好选用,但显然.get()和 .getall()更简洁。

11.本文未详细深入讲解css、xpath选择器本身语法,需要自己再去w3c学习。

完。

html选择器selector,网页解析神器-Selector选择器全面解析相关推荐

  1. 【Python爬虫】用CSS 选择器提取网页数据

    使用 pip 安装 requests_html 库 pip install requests_html 根据你的网络情况,通常需要几分钟时间. 在你的电脑任意位置,新建一个 crawler.py 文件 ...

  2. 硬核来袭!!!一篇文章教你入门Python爬虫网页解析神器——BeautifulSoup详细讲解

    文章目录 一.BeautifulSoup介绍 二.安装 三.bs4数据解析的原理 四.bs4 常用的方法和属性 1.BeautifulSoup构建 1.1 通过字符串构建 1.2 从文件加载 2.Be ...

  3. css 查看更多_在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(上篇)...

    /前言/ 今天小编给大家介绍Scrapy中另外一种选择器,即大家经常听说的CSS选择器. /CSS基础/ CSS选择器和Xpath选择器的功能是一致的,都是帮助我们去定位网页结构中的某一个具体的元素, ...

  4. 在Scrapy中如何利用Xpath选择器从网页中采集目标数据——详细教程(下篇)

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 二十四桥明月夜, 玉人何处教吹箫. ...

  5. HTML网页设计:css选择器

    一.为什么要用选择器? 要使用CSS对HTML页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器. 二.选择器的分类 基本选择器.层次选择器.伪类选择器.属性选择器.伪对象(伪元 ...

  6. html5复合选择器,web前端练习31----Css,选择器(基本选择器,复合选择器,属性选择器,伪类,伪元素,优先级,雪碧图练习)...

    参考文档:https://man.ilovefishc.com/css3/ 一.基本选择器: 1通配符选择器 * 2元素选择器 element 3类选择器 .class 4id选择器 #id 5内联样 ...

  7. jquery:选择器【基础选择器、层级选择器、属性选择器和方法操作、过滤选择器、筛选选择器和方法,可见性过滤选择器】

    名称 用法 描述 基础选择器 id选择器 $('#class') 指定id的元素 类选择器 $('.class') 指定类 标签选择器 $('div') 指定标签 并集选择器 $('div,class ...

  8. [css] 为什么说css中能用子代选择器的时候不要用后代选择器?

    [css] 为什么说css中能用子代选择器的时候不要用后代选择器? 选择从右到左依次解析匹配,所以后代选择器会去找它的所有父级, 而子代选择器只会选择直接的父级:减少匹配次数,提高效率 个人简介 我是 ...

  9. html四种选择器的特点,css四种选择器总结

    css 在网页开发中扮演着重要的角色,被誉为网页开发的三剑客,如果说html是人的外在器官部分,那css无疑是各个器官组成在一起然后表现出来,css又称样式重叠在网页排版布局中的地位举足轻重. 做为后 ...

最新文章

  1. OpenCV制作自己的线性滤镜
  2. 亚马逊首席科学家李沐「实训营」国内独家直播,马上报名 !
  3. 好用的UE新资源!【地貌资源】
  4. MFC获得主窗口和父窗口指针
  5. git 操作简明扼要,命令不需要多,够用就行
  6. 利用matlab点云工具处理点云
  7. mysql 设置数据库只读_如何设置mysql数据库为只读
  8. Python:PDF文件转图像
  9. 读《世界是数字的》笔记
  10. 数据库—并发调度的可串行性
  11. 计算机组成与人体类比,2020年安徽公务员考试真题模拟:类比推理(7.13)
  12. 关于带宽,数据速度,码元,码间串扰
  13. xp系统怎样安装传真服务器,Windows XP系统怎样配置传真机
  14. CI521支持读写A卡和B卡,PIN对PIN直接替换CV520和CI520,软硬件兼容
  15. 分享一个2.4G无线麦克风音频接收器的成功案例
  16. Mysql 同步 1236_MySQL主从同步报error 1236
  17. HNU--计算机网络实验2
  18. 微信小程序 向下跳动箭头
  19. 三大统计平台流量对比,百度偏高,51la与CNZZ持平
  20. 教你如何在linux里安装应用程序

热门文章

  1. 最全自动驾驶数据集分享系列一|目标检测数据集(3/3)
  2. java jdb_JDB 的简单使用
  3. Winform下ListView实现排序功能
  4. strerror(errno)函数
  5. 【用户研究】【实战】直接付费or抽卡, which do you prefer ?一则定性研究
  6. 通过patch-package创建补丁修改node_modules依赖下的源码
  7. 举例说明儿化音的作用_儿化韵有何作用举例说明
  8. 软件测试【测试用例设计】面试题详解
  9. windows安装cryptography或者pycrypto异常解决办法
  10. 计算机网络之Socket编程(UDP)