欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

从入门到放弃:python爬虫系列-xpath解析库的使用

程序员文章站 2022-05-31 11:41:20
吐血整理,绝对干货...

开始之前,请确保已经配置好了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