从入门到放弃:python爬虫系列-xpath解析库的使用
开始之前,请确保已经配置好了python3环境,并已经安装了lxml第三方库。
本文是博主的学习笔记,如有不足,还请指出。
关注我!持续更新ing~
此外,【从入门到放弃:python数据分析系列】正在更新中~
1. xpath介绍
1.1 什么是xPath?
xPath全称为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。同时,它完全适用于html的文档搜索。
XPath基于XML的树状结构,他提供了非常简洁明了的路径选择表达式,能够在数据结构树中找寻指定节点。
对于爬虫,我们完全可以利用xpath进行数据筛选和数据提取。
1.2 牛刀小试
这里博主提供一个小型的html文档,以下讲解都是基于本HTML文档。
<html>
<head>
<meta charset="utf-8">
<title>案例</title>
</head>
<body>
<div class="nav">
<ul>
<li><a href="">这是1</a></li>
<li><a href=""></a>这是2</li>
<li><a href="" id="text">这里有个text链接</a></li>
<li><img src="" class="myImg" >嗯,图片</li>
<li><span id="targs">超哥最帅</span></li>
<li>无</li>
</ul>
</div>
<div id="content sentence">
<p class="p1 " id= "content1">是以泰山不让土壤,故能成其大;河海不择细流,故能就其深;王者不却众庶,故能明其德。</p>
<p class="p2">治大者不可以烦,烦则<strong>乱</strong>;治小者不可以怠,怠则废</p>
</div>
</body>
</html>
我们通过这个小案例来感受一下如何使用xpath:
from lxml import etree
root = etree.HTML(html) # 这里传入的html是上文中的html文档内容 创建xpath解析对象
result = root.xpath('//title/text()') # 获取根目录下的title标签的文本内容
print(result)
输出结果如下:
['案例']
这里我们首先从lxml中导入etree,用于创建xpath解析对象;然后我们通过etree.HTML(html)将html转化成可以被xpath解析的对象;最后通过xpath路径选择表达式来选取title标签的文本内容。看到xpath路径选择表达式不要担心,其实非常的简单。接下来,博主进一步的讲解相关知识点。
2. 绝对路径和相对路径
关于这里路径的概念,相信了解HTML DOM树的读者都不陌生,html dom将html视作树结构,这种结构称为节点树。节点树中的各节点存在层级关系。如父节点(上一级节点)、子节点(下一级节点)、子孙节点(当前节点下的所有节点)、兄弟节点(同级节点)。而在这些节点中,顶端节点< HTML > 被称为根节点。下文中的绝对路径,就是以根节点为根目录。
2.1 xPath常用规则
在开始讲解绝对路径和相对路径之前,我们先来了解一些xpath常用语法规则,在接下来的内容中我们会经常用到:
- *:选取此节点下的所有节点
- //: 从当前节点选取子孙节点
- /: 从当前节点选取直接子节点
- . : 选取当前节点
- . . : 选取当前节点的父节点
- @ :选取属性
- [ ] : 指定属性
2.2 绝对路径
绝对路径就是在整个html树结构中,以html节点为根节点。即从根节点开始,依据树形结构对目的节点进行查找 。如,我们想要查找html文档中的所有的p标签:
//body/div/p
或
//p
2.3 相对路径
相对路径就是从当前路径开始,依据树形结构对目的节点进行查找。如,若当前节点是ul标签,我们要选择其子孙标签中的img标签,可以这样做:
./li/img
或
.//img
3. 数据提取
数据提取是爬虫中的重要组成部分,数据提取主要表现在2个部分:对文本内容的提取,对标签属性的提取。
3.1位置查找
位置查找是指根据标签名称或属性进行查找的过程。问位置查找主要有以下几个方面:
-
单属性匹配:属性的匹配可以使用[@]来进行筛选。如,要提取class为nav的div标签:
//div[@class="nav"]
提取id为text的a标签:
//a[@id="text"]
-
属性多值匹配: 有时候,一个标签的某个属性可能会有多个值,这时候使用上述方法就不再其作用。此时可以使用contains()函数。如我们提取文档中 id="content sentence"的div标签:
//div[contaions(@id," content sentence")]
第一个参数指定属性名称,第二个参数指定属性值,当标签中含有此属性值时就会被选中。
-
多属性匹配:也有的时候,单个属性不能定位到想要的标签,这时可以使用运算符 and来指定多属性:
//div/p[@class="p1" and @id="content1"]
-
排序匹配:当目标标签有多个且没有属性等特征值时,我们就无法使用上述的方法了。此时可以使用xpath的位置排序匹配:
选择第一个li(这里不同python等语言,起始位置是1)://div[@class="nav"]/ul/li[1]
选择最后一个li:
//div[@class="nav"]/ul/li[last()]
选择前三个li:
//div[@class="nav"]/ul/li[position()<4]
选择倒数第二个li:
//div[@class="nav"]/ul/li[last()-1]
3.2 文本提取
文本提取是对标签的内容进行提取,这里使用text()方法,如,要提取clas为p2的p标签的内容:
//p[@class="p2"]/text()
3.3 属性提取
有的时候也需要对标签的属性进行爬取,最常见的就是对图片或链接地址的获取。节点属性的获取可以使用@来获取,需要注意的是这里并不需要"[]":
//img[@class="myImg"]@src
4.结语
到现在为止,xpath常用的知识点已经全部介绍完了,如果想要了解更多的信息,请点击more。
本文地址:https://blog.csdn.net/qq_45807032/article/details/107544103