XPath
XPath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历。
XPath开发工具:Chrome插件XPath Helper、Firefox插件Try XPath
XPath节点:元素、属性、文本、命名空间、处理指令、注释、文档(根)节点。XML文档是被作为节点树来对待的,树的根被称为文档节点或者根节点。
XPath语法:XPath使用路径表达式来选取XML文档中的节点或节点集
谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。下标从1开始
*代表通配符
选取多个路径:通过在路径表达式中使用"|"运算符
contains:有时候某个属性中包含了多个值,可以使用contains函数
lxml库
pip install lxml
lxml是一个HTML/XML解析器,主要功能是如何解析和提取HTML/XML。在解析HTML代码时候,如果HTML代码不规范,他会自动进行补全。
from lxml import etree
text='''
<div>
<ul>
<li class="item-0"><a href="link1.html">第一个</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0"><a href="link5.html">a属性</a>
</ul>
</div>
'''
html = etree.HTML(text) # 将字符串的文件解析为html文档,生成一个XPath解析对象
result = etree.tostring(html) # 按字符串序列化html文档,html文档为字节类型,解析对象输出代码
# result = etree.tostring(html).decode('utf-8') # html文档为字符类型,进行解码
# 自动补全html文档
print(result)
从文件中读取html代码
from lxml import etree
html = etree.parse('hello.html') # 读取外部文件hello.html
result = etree.tostring(html,pretty_print=True).decode('utf-8')
print(result)
在lxml中使用XPath语法
# html文件
<html>
<body>
<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></li>
</ul>
</div>
</body>
</html>
from lxml import etree
html = etree.parse('hello.html')
# 获取所有li标签
result = html.xpath('//li')
print(result) # 得到列表 [<Element li at 0x29bc2c8>, <Element li at 0x29bc508>, <Element li at 0x29bc548>, <Element li at 0x29bc588>, <Element li at 0x29bc608>]
for i in result: # 按字符串序列化
print(etree.tostring(i).decode('utf8'))
# 获取所有li标签元素下的所有class属性的值
result = html.xpath('//li/@class')
print(result)
# 获取li标签下href为www.baidu.com的a标签
result = html.xpath('//li/a[@href="www.baidu.com"]')
print(result) # 输出为空,没有找到内容
# 获取li标签下的所有span标签
result = html.xpath('//li//span')
print(result)
# 获取li标签下的a标签里所有的class
result = html.xpath('//li/a//@class')
print(result)
# 获取最后一个li的a的href属性对应的值
result = html.xpath('//li[last()]/a/@href')
print(result)
# 获取倒数第二个li元素的内容
result = html.xpath('//li[last()-1]/a')
print(result)
print(result[0].text) # 列表获取内容
# 获取倒数第二个li元素的内容的第二种方式
result = html.xpath('//li[last()-1]/a/text()')
print(result)