XPath的选择功能十分强大,它提供了非常简洁明了的路径选择表达式。

from lxml import etree

text = '''
<div>
    <ul>
        <li class="one"><a href="link1">1</a></li>
        <li class="two"><a href="link2">2</a></li>
        <li class="three"><a href="link3">3</a></li>
        <li class="four"><a href="link4">4</a></li>
        <li class="five"><a href="link5">5</a>
    </ul>
</div>
'''
#将文本转换为网页类型,并修复补全
html = etree.HTML(text)

#将网页整体补为网页结构,打开文件路径
#html = etree.parse('demo.html',etree.HTMLParser())

print(html)

#将网页转换为文本类型,为bytes
result = etree.tostring(html)

#转化为str类型
result = result.decode("utf-8")

print(result)

xpath语法格式

nodename选取此节点的所有子节点。
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。
实例
路径表达式结果
bookstore选取 bookstore 元素的所有子节点。
/bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()❤️]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。
python中使用实例
#选择内容匹配
result = html.xpath('//*')

#选择内容匹配
result = html.xpath('//li/a')

#选择内容匹配
#属性为link4的a标签的父级的class属性
result = html.xpath('//a[@href="link4"]/../@class')

#@表示属性
result1 = html.xpath('//a[@href="link4"]/parent::*/@class')

#选择内容匹配
#属性为link4的a标签的父级的class属性
result = html.xpath('//a[@href="link4"]/text()')

#选择内容匹配
#contains(@属性,值)
result = html.xpath('//li[contains(@class,"three")]/a/text()')

#选择内容匹配
#contains(@属性,值)
result = html.xpath('//li[contains(@class,"three") and @name="item"]/a/text()')


#匹配第一个li
result1 = html.xpath('//li[1]/a/text()')

#最后一个倒数2
result2 = html.xpath('//li[last()-2]/a/text()')

#最后一个
result3 = html.xpath('//li[last()]/a/text()')

#小于3
result4 = html.xpath('//li[position()<3]/a/text()')

#选择内容匹配
result = html.xpath('//li[1]/ancestor::*')

#attribute轴,可以获取所有属性值
result = html.xpath('//li[1]/attribute::*')

#child轴,可以获取所有直接子节点
result = html.xpath('//li[1]/child::a[@href="link1"]')

#descendant轴,可以获取所有子孙节点
result = html.xpath('//li[1]/descendant::span')


#following轴,可以获取当前节点之后的所有节点
result = html.xpath('//li[1]/following::*[2]')


#选择内容匹配
#following-sibling轴,可以获取当前节点之后的所有同级节点
result = html.xpath('//li[1]/following-sibling::*')