html选择器selector,网页解析神器-Selector选择器全面解析
大部分人可能喜欢使用以下三个解析器对网页进行解析:
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选择器全面解析相关推荐
- 【Python爬虫】用CSS 选择器提取网页数据
使用 pip 安装 requests_html 库 pip install requests_html 根据你的网络情况,通常需要几分钟时间. 在你的电脑任意位置,新建一个 crawler.py 文件 ...
- 硬核来袭!!!一篇文章教你入门Python爬虫网页解析神器——BeautifulSoup详细讲解
文章目录 一.BeautifulSoup介绍 二.安装 三.bs4数据解析的原理 四.bs4 常用的方法和属性 1.BeautifulSoup构建 1.1 通过字符串构建 1.2 从文件加载 2.Be ...
- css 查看更多_在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(上篇)...
/前言/ 今天小编给大家介绍Scrapy中另外一种选择器,即大家经常听说的CSS选择器. /CSS基础/ CSS选择器和Xpath选择器的功能是一致的,都是帮助我们去定位网页结构中的某一个具体的元素, ...
- 在Scrapy中如何利用Xpath选择器从网页中采集目标数据——详细教程(下篇)
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 二十四桥明月夜, 玉人何处教吹箫. ...
- HTML网页设计:css选择器
一.为什么要用选择器? 要使用CSS对HTML页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器. 二.选择器的分类 基本选择器.层次选择器.伪类选择器.属性选择器.伪对象(伪元 ...
- html5复合选择器,web前端练习31----Css,选择器(基本选择器,复合选择器,属性选择器,伪类,伪元素,优先级,雪碧图练习)...
参考文档:https://man.ilovefishc.com/css3/ 一.基本选择器: 1通配符选择器 * 2元素选择器 element 3类选择器 .class 4id选择器 #id 5内联样 ...
- jquery:选择器【基础选择器、层级选择器、属性选择器和方法操作、过滤选择器、筛选选择器和方法,可见性过滤选择器】
名称 用法 描述 基础选择器 id选择器 $('#class') 指定id的元素 类选择器 $('.class') 指定类 标签选择器 $('div') 指定标签 并集选择器 $('div,class ...
- [css] 为什么说css中能用子代选择器的时候不要用后代选择器?
[css] 为什么说css中能用子代选择器的时候不要用后代选择器? 选择从右到左依次解析匹配,所以后代选择器会去找它的所有父级, 而子代选择器只会选择直接的父级:减少匹配次数,提高效率 个人简介 我是 ...
- html四种选择器的特点,css四种选择器总结
css 在网页开发中扮演着重要的角色,被誉为网页开发的三剑客,如果说html是人的外在器官部分,那css无疑是各个器官组成在一起然后表现出来,css又称样式重叠在网页排版布局中的地位举足轻重. 做为后 ...
最新文章
- OpenCV制作自己的线性滤镜
- 亚马逊首席科学家李沐「实训营」国内独家直播,马上报名 !
- 好用的UE新资源!【地貌资源】
- MFC获得主窗口和父窗口指针
- git 操作简明扼要,命令不需要多,够用就行
- 利用matlab点云工具处理点云
- mysql 设置数据库只读_如何设置mysql数据库为只读
- Python:PDF文件转图像
- 读《世界是数字的》笔记
- 数据库—并发调度的可串行性
- 计算机组成与人体类比,2020年安徽公务员考试真题模拟:类比推理(7.13)
- 关于带宽,数据速度,码元,码间串扰
- xp系统怎样安装传真服务器,Windows XP系统怎样配置传真机
- CI521支持读写A卡和B卡,PIN对PIN直接替换CV520和CI520,软硬件兼容
- 分享一个2.4G无线麦克风音频接收器的成功案例
- Mysql 同步 1236_MySQL主从同步报error 1236
- HNU--计算机网络实验2
- 微信小程序 向下跳动箭头
- 三大统计平台流量对比,百度偏高,51la与CNZZ持平
- 教你如何在linux里安装应用程序
热门文章
- 最全自动驾驶数据集分享系列一|目标检测数据集(3/3)
- java jdb_JDB 的简单使用
- Winform下ListView实现排序功能
- strerror(errno)函数
- 【用户研究】【实战】直接付费or抽卡, which do you prefer ?一则定性研究
- 通过patch-package创建补丁修改node_modules依赖下的源码
- 举例说明儿化音的作用_儿化韵有何作用举例说明
- 软件测试【测试用例设计】面试题详解
- windows安装cryptography或者pycrypto异常解决办法
- 计算机网络之Socket编程(UDP)