爬虫系列(九) xpath的基本使用
一、xpath 简介
究竟什么是 xpath 呢?简单来说,xpath 就是一种在 XML 文档中查找信息的语言
而 XML 文档就是由一系列节点构成的树,例如,下面是一份简单的 XML 文档:
<html>
<body>
<div>
<p>Hello world<p>
<a href="/home">Click here</a>
</div>
</body>
</html>
XML 文档中常见的节点包括:
- 根节点:html
- 元素节点:html、body、div、p、a
- 属性节点:href
- 文本节点:Hello world、Click here
XML 文档中常见的节点间关系包括:
- 父子:例如,<p> 和 <a> 是 <div> 的子节点,反之,也称 <div> 是 <p> 和 <a> 的父节点
- 兄弟:例如,<p> 和 <a> 称为兄弟节点
- 祖先/后代:例如,<body>、<div>、<p>、<a> 都是 <html> 的后代节点,反之,也称 <html> 是 <body>、<div>、<p>、<a> 的祖先节点
对于网页解析来说,xpath 比 re 更加方便简洁,故 Python 中也提供相应的模块 —— lxml.etree
我们可以使用 pip install lxml 命令进行安装
二、xpath 使用
在正式开始讲解 xpath 的使用方法之前,我们先来构造一个简单的 XML 文档用于测试
在一般的爬虫程序中,XML 文档就是爬取回来的网页源代码
>>> sc = '''
<html>
<head>
<meta charset="UTF-8"/>
<link rel="stylesheet" href="style/base.css"/>
<title>Example website</title>
</head>
<body>
<div id="images" class="content">
<a href="image1.html">Image1<img src="image1.jpg"/></a>
<a href="image2.html">Image2<img src="image2.jpg"/></a>
<a href="image3.html">Image3<img src="image3.jpg"/></a>
</div>
</body>
</html>
'''
1、导入模块
>>> from lxml import etree
2、构造对象
>>> html = etree.HTML(sc) # 构造 lxml.etree._Element 对象
>>> # lxml.etree._Element 对象还具有代码补全功能
>>> # 假如我们得到的 XML 文档不是规范的文档,该对象将会自动补全缺失的闭合标签
>>> # 我们可以使用 tostring() 方法将对象转化成 bytes 类型的字符串
>>> # 再使用 decode('utf-8') 方法将 bytes 类型的字符串转化为 str 类型的字符串
>>> print(etree.tostring(html).decode('utf-8'))
3、匹配数据
我们可以使用 xpath() 方法进行匹配
(1)xpath 匹配语法
xpath 方法接受一个满足 xpath 匹配语法的字符串作为参数
下面主要介绍一下 xpath 匹配语法:
/表示子代节点,例如 /E 表示匹配根节点下的子节点中的 E 元素节点>>> test = html.xpath('/html/head/title')
//表示后代节点,例如 //E 表示匹配根节点下的后代节点中的 E 元素节点>>> test = html.xpath('//a')
*表示所有节点,例如 E/* 表示匹配 E 元素节点下的子节点中的所有节点>>> test = html.xpath('/html/*')
text()表示文本节点,例如 E/text() 表示匹配 E 元素节点下的子节点中的文本节点>>> test = html.xpath('/html/head/title/text()')
@ATTR表示属性节点,例如 E/@ATTR 表示匹配 E 元素节点下的子节点中的 ATTR 属性节点>>> test = html.xpath('//a/@href')
谓语用于匹配指定的标签指定第二个 <a> 标签
>>> test = html.xpath('//a[2]')
指定前两个 <a> 标签
>>> test = html.xpath('//a[position()<=2]')
指定带有 href 属性的 <a> 标签
>>> test = html.xpath('//a[@href]')
指定带有 href 属性且值为 image1.html 的 <a> 标签
>>> test = html.xpath('//a[@href="image1.html"]')
指定带有 href 属性且值包含 image 的 <a> 标签
>>> test = html.xpath('//a[contains(@href,"image")]')
(2)_Element 对象
xpath 方法返回字符串或者匹配列表,匹配列表中的每一项都是 lxml.etree._Element 对象
下面主要介绍一下 _Element 对象的常用属性与方法:
我们先用 xpath 方法得到匹配列表 tests 作为测试样例,tests 中的每一项都是一个 _Element 对象
>>> test = html.xpath('//a[@href="image1.html"]')
>>> obj = test[0]
tag返回标签名
>>> obj.tag
'a'
attrib返回属性与值组成的字典
>>> obj.attrib
{'href': 'image1.html'}
get()返回指定属性的值
>>> obj.get('href')
'image1.html'
text返回文本值
>>> obj.text
'Image1'
【参考资料】
【爬虫系列相关文章】
爬虫系列(九) xpath的基本使用的更多相关文章
- 爬虫系列(十) 用requests和xpath爬取豆瓣电影
这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...
- 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论
这篇文章,我们继续利用 requests 和 xpath 爬取豆瓣电影的短评,下面还是先贴上效果图: 1.网页分析 (1)翻页 我们还是使用 Chrome 浏览器打开豆瓣电影中某一部电影的评论进行分析 ...
- 爬虫系列(三) urllib的基本使用
一.urllib 简介 urllib 是 Python3 中自带的 HTTP 请求库,无需复杂的安装过程即可正常使用,十分适合爬虫入门 urllib 中包含四个模块,分别是 request:请求处理模 ...
- 爬虫系列(二) Chrome抓包分析
在这篇文章中,我们将尝试使用直观的网页分析工具(Chrome 开发者工具)对网页进行抓包分析,更加深入的了解网络爬虫的本质与内涵 1.测试环境 浏览器:Chrome 浏览器 浏览器版本:67.0.33 ...
- 爬虫系列(四) 用urllib实现英语翻译
这篇文章我们将以 百度翻译 为例,分析网络请求的过程,然后使用 urllib 编写一个英语翻译的小模块 1.准备工作 首先使用 Chrome 浏览器打开 百度翻译,这里,我们选择 Chrome 浏览器 ...
- 爬虫系列(五) re的基本使用
1.简介 究竟什么是正则表达式 (Regular Expression) 呢?可以用下面的一句话简单概括: 正则表达式是一组特殊的 字符序列,由一些事先定义好的字符以及这些字符的组合形成,常常用于 匹 ...
- 爬虫系列(六) 用urllib和re爬取百度贴吧
这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...
- 爬虫系列(七) requests的基本使用
一.requests 简介 requests 是一个功能强大.简单易用的 HTTP 请求库,可以使用 pip install requests 命令进行安装 下面我们将会介绍 requests 中常用 ...
- 爬虫系列(八) 用requests实现天气查询
这篇文章我们将使用 requests 调用天气查询接口,实现一个天气查询的小模块,下面先贴上最终的效果图 1.接口分析 虽然现在网络上有很多免费的天气查询接口,但是有很多网站都是需要注册登陆的,过程比 ...
随机推荐
- POJ 题目2761 Feed the dogs(主席树||划分树)
Feed the dogs Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 16860 Accepted: 5273 De ...
- 一个APP爆炸的时代,假设没有wifi
我们每天都离不开的微信,又传来了一个新消息.你造?微信公众平台新增了设备功能.眼下可支持可穿戴设备,将来呢,前景不可限量!能够想象,"后果"是我们越来越离不开微信,依附于它.这样的 ...
- Execution Order In a Test Plan
1.Config Element 2.Pre Processors 3.Timer 4.Sampler 5.Post Processors 6.Assertions 7.Listener
- Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图
Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方面的开 ...
- HDU3487 Play with Chain splay 区间反转
HDU3487 splay最核心的功能是将平衡树中的节点旋转到他的某个祖先的位置,并且维持平衡树的性质不变. 两个操作(数组实现) cut l,r, c把[l,r]剪下来放到剩下序列中第c个后面的位置 ...
- IDEA Spark Streaming Flume数据源 --解决无法转化为实际输入数据,及中文乱码(Scala)
需要三步: 1.shell:往 1234 端口写数据 nc localhost 1234 2.shell: 启动flume服务 cd /usr/local2/flume/bin ./flume-ng ...
- 删除".SVN"文件夹方法(转载)
转自:http://www.cnblogs.com/lr-ting/archive/2012/09/03/2666271.html 一.在linux下 删除这些目录是很简单的,命令如下 find . ...
- scrapy xpath中提取多个class值
xpath中没有提供对class的原生查找方法.但是 stackoverflow 看到了一个很有才的回答: This selector should work but will be more eff ...
- hibernate基础学习---hierbnate2级缓存
1:开启二级缓存sessionFactory需要安装jar包 2:在实体类配置文件添加(配置二级缓存).我的配置文件是Account.hbm.xml <?xml version="1. ...
- [Swift通天遁地]四、网络和线程-(4)使用Alamofire实现网络请求
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...