1.使用XPath
常用规则:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
. . | 选取当前节点的父节点| |
@ | 获取属性 |
示例文档text:
<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 itemL</a></li>
<li class="item-1"><a href="link4.html">forth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
转换成可解析对象:
from lxml import etree
#初始化一个html对象,使其可以被xpath解析
#html = etree.HTML(text) 读取代码中声明的文本
html = etree.parse('./test.html',etree.HTMLParser())#解析文件
result = etree.tostring(html).decode('utf-8')#转换成str类型
搜索所有节点:
result = html.xpath('//*')
#result = html.xpath('//nodename') #获取所有的nodename节点
搜索子节点:
result = html.xpath('//li/a')
#result = html.xpath('//nodename/subnode') #获取子节点
搜索父节点:
result = html.xpath('//a[@href="link4.html"]/../@class')#获取属性为link4.html的a节点的父节点的class属性
#@获取属性
#result = html.xpath('//nodename/../') #获取父节点
#result = html.xpath('//nodename/parent::*')#获取父节点
获取文本:
result = html.xpath('//li/a[@href="link2.html"]/text()')
=====output=======
['second item']
[Finished in 55ms]
获取属性:
result = html.xpath('//li/a/@href')
#//node/@attribute #获取属性
#//node[@attribute] #筛选属性,获取节点
属性多值匹配:
#li 的class属性有li 和 li-first 两个值,
text = '''
<li class="li li-first"><a href="link1.html">first item</a></li>
'''
html = etree.HTML(text)
#result = html.xpath('//li[@class="li"]/a/text()')#==》【】无法获取
result = html.xpath('//li[contains(@class,"li-first")]/a/text()')#==>['first item']
#contains(@contribute,"value1 value2..")匹配包含v1,v2属性的节点
#
多个属性匹配:
#li 的属性有class 和 name 两个,
text = '''
<li class="li li-first" name="item"><a href="link1.html">first item</a></li>
'''
html = etree.HTML(text)
#result = html.xpath('//li[@class="li"]/a/text()')#==》【】无法获取
result = html.xpath('//li[contains(@class,"li-first") and @name="item"]/a/text()')#==>['first item']
#多属性使用and连接
#
Xpath中 的运算符
and 、or、
mod(取余)
| (//node1|node2 返回一个包含node12的集合)
+ - * div(8 div 4=2)
+ = != < > <= >=
按序选择:
result = xpath('//li[1]/a/text()')#第一个
result = xpath('//li[last()]/a/text()')#最后一个
result = xpath('//li[position()<3]/a/text()')#第1,2个
result = xpath('//li[last-2]/a/text()')#倒数第三个
节点轴选择:
result = html.xpath('//li[1]//ancestor::*')#li[1]的所有祖先节点
result = html.xpath('//li[1]//ancestor::div')#li[1]的div祖先节点
result = html.xpath('//li[1]//attribute::*')#li[1]的所有属性
result = html.xpath('//li[1]//child::a[@href="link1.html"]')#li[1]的子节点中属性为link1.html的a节点
descendant:所有子孙节点
following:后续节点
following-sibling:后续节点中与当前节点同级的节点
...
了解更多:
XPath更多用法
Python lxml库用法