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读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
Python判断文本中消息重复次数的方法
Apr 27 Python
浅谈python迭代器
Nov 08 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
Python3中的列表生成式、生成器与迭代器实例详解
Jun 11 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
Python 实用技巧之利用Shell通配符做字符串匹配
Aug 23 Python
opencv实现简单人脸识别
Feb 19 Python
pytorch模型存储的2种实现方法
Feb 14 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
python中scipy.stats产生随机数实例讲解
Feb 19 Python
用python 绘制茎叶图和复合饼图
Feb 26 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
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
JavaScript EasyPager 分页函数
2011/05/25 Javascript
分页栏的web标准实现
2011/11/01 Javascript
JS将秒换成时分秒实现代码
2013/09/03 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
Django中使用Celery的方法示例
2018/11/29 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
python中yield的用法详解
2021/01/13 Python
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
家长对孩子评语
2014/01/30 职场文书
安全生产协议书
2016/03/22 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL