python3 爬虫 XPath库的使用

本文介绍XPath的基本用法及实战技巧,包括属性定位、层级索引定位、逻辑运算、模糊匹配等,并通过实例展示如何使用lxml库进行节点选取、文本获取等操作。

XPath常用规则
在这里插入图片描述
小技巧
生成xpath,只需右键COPY选择COPY XPath即可,截图截不下来,自行尝试
在这里插入图片描述

属性定位:
#找到class属性值为song的div标签
//div[@class=“song”]
层级&索引定位:
#找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
//div[@class=“tang”]/ul/li[2]/a
逻辑运算:
#找到href属性值为空且class属性值为du的a标签
//a[@href="" and @class=“du”]
模糊匹配:
//div[contains(@class, “ng”)]
//div[starts-with(@class, “ta”)]
取文本:
# /表示获取某个标签下的文本内容
# //表示获取某个标签下的文本内容和所有子标签下的文本内容
//div[@class=“song”]/p[1]/text()
//div[@class=“tang”]//text()
取属性:
//div[@class=“tang”]//li[2]/a/@href

//title[@lang='english'] 代表选择所有名称为title,属性值为english的节点
from lxml import etree

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 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>
</ul>
</div>
'''
html = etree.HTML(text)  #构造一个XPath解析对象
result = etree.tostring(html) #修正text中的代码
print(type(result))
print(result.decode('utf-8'))

'''
from lxml import etree

html = etree.parse('./test.html',etree.HTMLParser()) #解析当前文件夹下的文件
result = etree.tostring(html)
print(result.decode('utf-8'))
'''

在这里插入图片描述
获取所有节点

from lxml import etree

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 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>
</ul>
</div>
'''
html = etree.HTML(text)  #html = etree.parse('./test.html',etree.HTMLParse()) 记得括号
result = html.xpath('//*') #获取所有节点html、li等
print(result)

在这里插入图片描述
子节点

# /获取子节点  //获取子孙节点
from lxml import etree

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 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>
</ul>
</div>
'''
html = etree.HTML(text)  #html = etree.parse('./test.html',etree.HTMLParse()) 记得括号
result = html.xpath('//li/a') #获取li节点下的a节点
print(result)
result1 = html.xpath('//ul/a') 
print(result1)
result2 = html.xpath('//ul//a')
print(result2)

在这里插入图片描述
父节点

from lxml import etree
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 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>
</ul>
</div>
'''
html = etree.HTML(text)  #html = etree.parse('./test.html',etree.HTMLParse()) 记得括号
#result = html.xpath('//a[@href="link4.html"]/../@class')
result = html.xpath('//a[@href="link4.html"]/parent::*/@class')
print(result)

在这里插入图片描述
文本获取text()

from lxml import etree

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 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>
</ul>
</div>
'''
#html = etree.parse('./test.html',etree.HTMLParse())
html = etree.HTML(text)
result = html.xpath('//li[@class="item-0"]/a/text()')
result1 = html.xpath('//li/a/@href')
print(result)
print(result1)

在这里插入图片描述
属性多值匹配

from lxml import etree

text='''
<li class="li li-firsr"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class,"li")]/a/text()')
print(result)

在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值