Path是一门在XML文档中查信息的语言,XPath可用来XML文档中对元素和属性进行遍历。XPath是W3C XSLT 标准的主元素,并且XQuery和Xpointer都构建于XPath表达上。XPath在Python的爬虫学习中,起着举足轻重的作用,对比正则表达式re,两者可以完成同样的工作,实现功能页类似,但XPath比re具有明显的优势。
XPath,全称 XML Path Language, 是一种小型语言查询语言,有一下优点:
Python开发使用XPath条件:由于XPath属于lxml库。Inc,需要先安装lxml库,安装步骤请参考:https://www.cnblogs.com/luyj00436/p/15415280.html 。
输入安装的pip命令为:
pip install lxml
本文的主要内容包括:
下面介绍一下XPaht的基础语法知识,常见的使用方法主要有以下几种:
以下是一段HTML代码:
1 <div> 2 <ul> 3 <li class="item-0"><a href="www.baidu.com"></a></li> 4 <li class="item-1"><a href="https://www.cnblogs.com/luyj00436">myblog</a></li> 5 <li class="item-2"><a href="https://www.csdn.net/">csdn</a></li> 6 <li class="item-3"><a href="https://www.hao123.com/">hao123</a></li>
显然,这段HTML代码没有闭合,因此可以使用lxml中的etree模块进行补全,示例代码入如下:
1 from lxml import etree 2 3 text = ''' 4 <div> 5 <ul> 6 <li class="item-0"><a href="www.baidu.com"></a></li> 7 <li class="item-1"><a href="https://www.cnblogs.com/luyj00436">myblog</a></li> 8 <li class="item-2"><a href="https://www.csdn.net/">csdn</a></li> 9 <li class="item-3"><a href="https://www.hao123.com/">hao123</a></li> 10 ''' 11 html = etree.HTML(text) 12 result = etree.tostring(html) 13 print(result.decode("UTF-8"))
运行后控制台会输出:
可以看到,etree不仅闭合了节点,还添加了其他需要的标签。除了直接读取文本进行解析外,etree还可以读取文件进行解析,示例代码如下:
1 from lxml import etree 2 3 html = etree.parse('./test.html',etree.HTMLParser()) 4 result = etree.tostring(html) 5 print(result.decode("UTF-8"))
根据XPath常用规则可知,通过“//”可以查找当前节点的子孙节点,以上面的HTML为例获取所有的节点,示例代码如下:
1 from lxml import etree 2 3 html = etree.parse('./test.html',etree.HTMLParser()) 4 result = html.xpath('//*') # 表示获取当前节点的子孙的节点,*表示所有节点, 5 # //* 表示获取当前节点下的所有节点 6 for item in result: 7 print(item)
注:如果不是获取所有节点而是指定获取某个节点,只需要将“*”改为指定节点名称即可,如获取所有的节点。这个HTMLdiam可以直接放在代码变量中,也可以放在文件中,效果一致。
根据XPath的常用规则可知,通过“/”或“//”可以获取子孙结点或子节点。
“//”表示选择的所有节点,‘/’表示选择的直接节点。
示例代码如下:
1 from lxml import etree 2 3 html = etree.parse('./test.html',etree.HTMLParser()) 4 result = html.xpath('//ul//a') # 先选择所有ul节点,再选择ul节点下的所有a节点。包含元素。 5 result = html.xpath('//ul/a') # 先选择所有ul节点,再选择ul节点下的直接子节点a,不包含元素 6 result = html.xpath('//li/a') # 先选择所有li节点,再选择ul节点下的直接子节点a,包含元素
大多数时候,找到指定节点都是要获取节点的文本信息。这里使用text()方法获取节点的文本。获取所有的a标签文本信息,示例代码如下。
1 from lxml import etree 2 3 html = etree.parse('./test.html',etree.HTMLParser()) 4 result = html.xpath('//ul//a/text()') 5 print(result)
有兴趣可以去W3School官网查看XPath教程。