Xpath库的用法总结

一.初始化

1.读取字符串初始化
from lxml import etree

text = '''
<div class='wrap'>
<div id='container'>
<ul class='list'>
<li class="item-0">first item</li>
<li class="item-1">this is a li<a href="link2.html">second item</a></li>
<li class="item-0 active">this is a li<a href="link3.html">third item</a></li>
<li class="item-1 active" name="li">this is a li<a href="link4.html">third item</a></li>
</ul>
</div>
</div>
<div id='container'>
<ul class='list'>
<li class="item-3">first item</li>
<li class="item-4">second item</li>
</ul>
</div>
'''
print("读取字符串")
# 将text的HTML文本构造成一个xpath对象
html = etree.HTML(text)
# 对html文本进行修正,生成为一个标准的html格式文本
result = etree.tostring(html)
# 输出文本,由于修正后的html文本是比特类型的,需要进行编码,为str类型
print(result.decode('utf-8'))
2.读取文本文件初始化
print("读取文本文件")
html = etree.parse('text.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))

二.查找节点

A.标签匹配
1.所有节点: //* 可通过下标索引选择对应的节点
print("所有节点")
result = html.xpath('//*')
print(result)
2.选取特定子节点: //li/a //li//a ; /只用于获取子节点, //用于获取所有子孙节点
print("选取子节点")
result = html.xpath('//li/a')
print(result)
B.属性匹配
1.属性匹配
print("属性匹配")
result = html.xpath('//li[@class="item-0"]')
print(result)
2.属性多值匹配:通过contains(@class,“key”)即可筛选出包含key的标签
print("属性多值匹配")
result = html.xpath('//li[contains(@class,"item-1")]')
print(result)
3.多属性匹配:若多个属性匹配一个节点,可以通过and来并列,如@class=“item-0” and @name=“li”
print("多属性匹配一个节点")
result = html.xpath('//li[contains(@class,"item-1") and @name="li"]//text()')
print(result)
C.关系匹配
1.按序选择节点: [1]:选择第一个节点, [last( )]:选择最后一个节点, [position() < 3 ]:前两个节点
# 会选择同一级别相应位置的所有节点

print("按序选择节点")
result = html.xpath('//li[position()<3]/text()')
print(result)
2.选取父节点:使用…或者parent::
print("选取父节点")
result1 = html.xpath('//a[@href="link4.html"]/../@class')
result2 = html.xpath('//a[@href="link4.html"]/parent::*/@class')
print(result1, result2)
3.节点轴选择
# ancestor:所有祖先节点

print("祖先节点")

result = html.xpath('//li[1]/ancestor::div[@id="container1"]')

print(result)

# attribute:所有属性

print("所有属性")

result = html.xpath('//li[1]/attribute::*')

print(result)

# child:所有的直接子节点

print("所有的直接节点")

result = html.xpath('//li[2]/child::*')

print(result)

# descendant:所有的子孙节点

print("所有子孙节点")

result = html.xpath('//ul/descendant::a/text()')

# //ul只会选择第一个ul,而li[1]会选择同级别所有第一个li标签

print(result)

# following:当前节点后的所有节点

print("当前节点后的所有节点")

result = html.xpath('//li[1]/following::*/text()')

print(result)

# following-sibling:当前节点后所有同级节点

print("当前节点后的所有节点")

result = html.xpath('//li[1]/following-sibling::*//text()')

print(result)

三.获取信息

1.获取文本:不会获得html标签文本,且使用/只会获得当前标签内的字符串, //会获得该标签子孙内的所有字符串
print("获取文本")
result = html.xpath('//li[@class="item-1"]/text()')
print(result)
2.属性获取:直接加上/@class即可获得当前标签的属性值
print("属性获取")
result = html.xpath('//div[@id="container1"]//li/@class')
print(result)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值