使用XPath中

本文介绍了使用Python的lxml库通过XPath进行HTML解析的基本操作,包括选取所有节点、子节点、父节点以及属性匹配的方法,并展示了如何获取文本内容。示例代码详细解释了如何选取特定class的li节点、获取a子节点以及通过属性筛选元素。
摘要由CSDN通过智能技术生成

1.所有结果

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//*')
print(result)

这里使用*代表匹配所有节点,也就是整个HTML文本中的所有节点都会被获取。返回形式是一个列表,每个元素是Element类型,其后跟了节点的名称。

如果想获取所有li节点:

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//li')
print(result)
print(result[0])

[0]代表去除其中第一个对象。

2.子节点

我们可以通过/或//即可查找元素的子节点或子孙节点。假如选择想选择li节点的所有直接a子节点,

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//li/a')
print(result)

这里通过追加/a即选择了所有li节点的所有直接a子节点。如果要获取所有子孙节点,就可以使用//。如,要获取ul节点下的所有子孙a节点:

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//ul//a')
print(result)

运行结果是相同的。

但如果这里用//ul/a,就无法获取任何结果了。ul节点下没有直接的a子节点,只有li节点。

3.父节点

我们用..来实现查找父节点。

如,现在首先选中href属性为link4.html的a节点,然后再获取其父节点,然后再后去其class属性:

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//a[@href="link4.html"]/../@class')
print(result)

同时,我们也可以通过parent::来获取父节点:

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//a[@href="link4.html"]/parent..*/@class')
print(result)

3.属性匹配

再选取的时候,我们还可以用@符号进行属性过滤。如我们要获取class为item-1的li节点:

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//li[@class="item-0"]')
print(result)

这里我们通过加入[@class-"item-0"],限制了节点的class属性为item-0。

4.文本获取

我们用XPath中的text()方法获取节点中的文本,接下来尝试获取前面li节点中的文本:

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//li[@class="item-0"]/a/text()')
print(result)

这里我们是逐层获取的,先选取了li节点,又利用/选取其直接子节点a,然后再选择其文本。

再看另一种方式//获取:

from lxml import etree
html=etree.parse('./text.html', etree.HTMLParser())
result=html.xpath('//li[@class="item-0"]//text()')
print(result)

如果想获取子孙节点内部的所有文本,可以直接用//加text()的方式,这样可以保证获取到最全面的文本信息,但可能会夹杂一些换行符等特殊字体。如果想获取某些特定子孙节点下的所有文本,可以先选取到特定的子孙节点,然后再调用text()方法获取其内部文本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值