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()方法获取其内部文本。
本文介绍了使用Python的lxml库通过XPath进行HTML解析的基本操作,包括选取所有节点、子节点、父节点以及属性匹配的方法,并展示了如何获取文本内容。示例代码详细解释了如何选取特定class的li节点、获取a子节点以及通过属性筛选元素。
1838

被折叠的 条评论
为什么被折叠?



