Python爬虫lxml模块安装导入和xpath基本语法
lxml模块是Python的一个解析库,主要用于解析HTML和XML文件。
一、安装导入
使用包管理器安装,在cmd下或编辑器下的控制台,运行:
pip install lxml
导入:
from lxml import etree
二、xpath基础知识
XPath(XML Path Language,即XML路径语言)是一种在XML文档中查找信息的语言。它基于XML的树状结构,使用路径表达式来选取XML文档中的节点或节点集
- //:代表寻找所有(如://div,找到的就是页面所有的div标签)
- /:代表从根节点找一个
- @:寻找属性(如://div[@class='123'],找到的是所有class属性值为123的标签)
也可以寻找属性值://div/@class。找到的是所有div的class属性值
可以结合节点选择器使用,如 //book[@price>35]
表示选择所有 price
属性值大于35的 book
元素。
- 当前节点:使用点
.
表示选取当前节点。 - 父节点:使用两个点
..
表示选取当前节点的父节点。 *
匹配任何元素名。例如,//*
表示选择文档中的所有元素。@*
匹配任何属性名。例如,//book[@*]
表示选择所有具有至少一个属性的book
元素。- 谓词用于进一步筛选满足条件的节点,它被嵌在方括号
[]
中。例如,/root/child[1]
表示选择root
元素的第一个child
子元素。 - 谓词可以使用比较运算符(如
=
、!=
、<
、>
等)、逻辑运算符(如and
、or
、not
)和XPath函数(如last()
、position()
、starts-with()
、contains()
等)。 child::
选择当前节点的子元素节点。attribute::
选择当前节点的属性。descendant::
选择当前节点的所有后代节点。parent::
选择当前节点的父节点。ancestor::
选择当前节点的所有祖先节点。following-sibling::
选择当前节点之后的同级节点。preceding-sibling::
选择当前节点之前的同级节点
三、案例
比如我们有一个数据:
html_data = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
我们可以看出,这个数据并不是一个完整的html的结构,但是,xpath需要通过结构路径寻找节点,所以我们需要补全结构,而且要把这个数据解析为element对象才可以通过xpath对其操作,所以我们用到以下语法:
html=etree.HTML(html_data)
etree.HTML()
:将字符串形式的HTML代码解析为Element对象。该函数会自动补全缺失的标签,并尝试修正HTML代码中的错误。括号中是要解析的数据,html是他解析后返回的element对象。
接下来我们就可以对这个数据进行操作了
案例1:
拿到第二个li的class值:
html.xpath("//li[2]/@class")
案例2:
拿到最后一个li的a标签的href属性值:
html.xpath("//li[last()]/a/@href")
案例3:
根据属性值获取元素内容
html.xpath("//li/a[@href='link1.html']/text()")