使用时先安装 lxml 包
开始使用
和beautifulsoup类似,首先我们需要得到一个文档树
- 把文本转换成一个文档树对象
from lxml import etree if __name__ == '__main__': doc=''' <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">third item</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> ''' html = etree.HTML(doc) result = etree.tostring(html) print(str(result,'utf-8'))
- 把文件转换成一个文档树对象
from lxml import etree # 读取外部文件 index.html html = etree.parse('./index.html') result = etree.tostring(html, pretty_print=True) #pretty_print=True 会格式化输出 print(result)
均会打印出文档内容
节点、元素、属性、内容
xpath 的思想是通过 路径表达 去寻找节点。节点包括 元素 , 属性 ,和 内容
- 元素举例
html ---> <html> ...</html> div ---> <div> ...</div> a ---> <a> ...</a>
这里我们可以看到,这里的 元素 和html中的 标签 一个意思。单独的元素是无法表达一个路径的,所以单独的元素不能独立使用
路径表达式
/ 根节点,节点分隔符, // 任意位置 . 当前节点 .. 父级节点 @ 属性
通配符
* 任意元素 @* 任意属性 node() 任意子节点(元素,属性,内容)
谓语
使用中括号来限定元素,称为谓语
//a[n] n为大于零的整数,代表子元素排在第n个位置的<a>元素 //a[last()] last() 代表子元素排在最后个位置的<a>元素 //a[last()-] 和上面同理,代表倒数第二个 //a[position()<3] 位置序号小于3,也就是前两个,这里我们可以看出xpath中的序列是从1开始 //a[@href] 拥有href的<a>元素 //a[@href='www.baidu.com'] href属性值为'www.baidu.com'的<a>元素 //book[@price>2] price值大于2的<book>元素
多个路径
用 | 连接两个表达式,可以进行 或 匹配
//book/title | //book/price
函数
xpath内置很多函数。更多函数查看 https://www.w3school.com.cn/xpath/xpath_functions.asp
- contains(string1,string2)
- starts-with(string1,string2)
- ends-with(string1,string2) #不支持
- upper-case(string) #不支持
- text()
- last()
- position()
- node()
可以看到last()也是个函数,在前面我们在谓语中已经提到过了
案例
定位元素
匹配多个元素,返回列表
from lxml import etree if __name__ &#