Python爬虫基础之XPath语法与lxml库的用法详解


Posted in Python onSeptember 13, 2018

前言

本来打算写的标题是XPath语法,但是想了一下Python中的解析库lxml,使用的是Xpath语法,同样也是效率比较高的解析方法,所以就写成了XPath语法和lxml库的用法

XPath 即为 XML 路径语言,它是一种用来确定 XML(标准通用标记语言的子集)文档中某部分位置的语言。

XPath 基于 XML 的树状结构,提供在数据结构树中找寻节点的能力。 XPath 同样也支持HTML。

XPath 是一门小型的查询语言。

python 中 lxml库 使用的是 Xpath 语法,是效率比较高的解析方法。

下面话不多说了,来一起看看详细的介绍吧

安装

为什么要用这个库呢,因为要写爬虫啊,利用lxml库来解析 HTML 代码,同时lxml也继承了libxml2的特性自动修正HTML代码,利用pip安装即可

pip install lxml

XPath语法

XPath是一门在XML文档中查找信息的语言,可以用于在XML文档中通过元素和属性进行导航

举个栗子 ?

我们可以使用XPath提取网站地图中的所有链接,也就是说可以使用XPath去找我们HTML中的一些具体的东西

节点关系

在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)

再举个栗子 ?

<urlset>
<url>
<loc>https://qq52o.me</loc>
<lastmod>2018-04-28T19:00:42+00:00</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
</urlset>

第一个:父(Parent)

每个元素以及属性都有一个父

url元素是 loc、lastmod、changefreq以及 priority元素的父

第二个:子(Children)

元素节点可有零个、一个或多个子

loc、lastmod、changefreq以及 priority元素都是url元素的子

第三个:同胞(Sibling)

拥有相同的父的节点

loc、lastmod、changefreq以及 priority元素都是url元素的同胞

第四个:先辈(Ancestor)

某节点的父、父的父,等等

loc元素的先辈是 url元素和 urlset元素

第五个:后代(Descendant)

某个节点的子,子的子,等等

urlset的后代是url、loc、lastmod、changefreq以及 priority元素

如果你分不清楚,就按照子元素从上到下的去找元素节点

选取节点

XPath使用路径表达式在 XML 文档中选取节点,节点是通过沿着路径或者 step 来选取的,也就是上面所说的按照子元素从上到下去找元素节点

这些是最有用的路径表达式 ?

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

实例

路径表达式 结果
urlset 选取urlset元素的所有子节点
/urlset 选取根元素 urlset
urlset/url 选取属于urlset的子元素的所有url元素
//url 选取所有url子元素,而不管它们在文档中的位置
urlset//url 选择属于urlset元素的后代的所有url元素,而不管它们位于urlset之下的什么位置
//@href 选取名为href的所有属性

其他XPath语法请参考w3school

XPath实例测试

提取本站网站地图中id属性为content的的子元素h3的内容以及子元素a的href属性,F12去看代码找这个属性

Python爬虫基础之XPath语法与lxml库的用法详解

div的id属性,下面的子元素h3的内容,直接利用 text 方法来获取元素的内容,然后输出

Python爬虫基础之XPath语法与lxml库的用法详解

这里的子元素层级关系必须按顺序写好,不然会报错的

IndexError: list index out of range

这就说明你的XPath规则没写好,list是一个空的,没有一个元素

XPath 是一个非常好用的解析方法,同时也是作为爬虫学习的基础

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python入门篇之函数
Oct 20 Python
python中的set实现不重复的排序原理
Jan 24 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
django-rest-framework解析请求参数过程详解
Jul 18 Python
python 基于dlib库的人脸检测的实现
Nov 08 Python
python 一维二维插值实例
Apr 22 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 Python
OpenCV实现常见的四种图像几何变换
Apr 01 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 #Python
python集合比较(交集,并集,差集)方法详解
Sep 13 #Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 #Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 #Python
python单例模式获取IP代理的方法详解
Sep 13 #Python
如何利用python制作时间戳转换工具详解
Sep 12 #Python
Python get获取页面cookie代码实例
Sep 12 #Python
You might like
php self,$this,const,static,-&amp;gt;的使用
2009/10/22 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
php中请求url的五种方法总结
2017/07/13 PHP
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
2009/05/25 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
Position属性之relative用法
2015/12/14 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
Python中format()格式输出全解
2019/04/12 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
服装店营销方案
2014/03/10 职场文书
学生操行评语大全
2014/04/24 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python