从入门到放弃: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标签,可以这样做:

扫描二维码关注公众号,回复: 12180613 查看本文章
./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

猜你喜欢

转载自blog.csdn.net/qq_45807032/article/details/107544103