首页 > 其他 > 详细

lxml中xpath获取当前节点所有子节点的文本方法

时间:2021-01-24 18:38:04      阅读:33      评论:0      收藏:0      [点我收藏+]

一、场景还原

现在假定有如下html代码:

<div class="content">
    <p>输入只有一行半径r.</p>
</div>
<div class="content">
    <p>输出有多行,每一行是跟输入对应面积.</p>
    <p>输出保留6位小数</p>
</div>

我需要获取每个content下的所有子节点的文本。形如这样

[‘输入只有一行半径r.‘, ‘输出有多行,每一行是跟输入对应面积. 输出保留6位小数‘]

二、解决方案

代码如下:

from lxml import etree

txt = """
<div class="content">
    <p>输入只有一行半径r.</p>
</div>
<div class="content">
    <p>输出有多行,每一行是跟输入对应面积.</p>
    <p>输出保留6位小数</p>
</div>
"""
html = etree.HTML(txt)
contents = html.xpath(‘//div[@class="content"]‘)
lst = []
for e in content:
    lst.append(e.xpath(‘string(.)‘))
print(lst)
‘‘‘
输出如下:
[‘\n    输入只有一行半径r.\n‘, ‘\n    输出有多行,每一行是跟输入对应面积.\n    输出保留6位小数\n‘]
‘‘‘

其实这已经和我们想要的结果差不多了,对字符串稍作处理就是我们想要的结果了

lst = []
for e in content:
    lst.append(str(e.xpath(‘string(.)‘)).replace(‘\n‘,‘‘).strip())
print(lst)
‘‘‘
输出如下:
[‘输入只有一行半径r.‘, ‘输出有多行,每一行是跟输入对应面积.    输出保留6位小数‘]
‘‘‘

步骤1:找到父节点集合

contents = html.xpath(‘//div[@class="content"]‘)

这一句就是在匹配所有的class属性为content的div标签

步骤2:遍历父节点集合

lst = []
for e in content:
    lst.append(e.xpath(‘string(.)‘))
print(lst)

遍历这个集合,并且利用xpath的string()方法获取当前节点所有子节点的文本

三、补充解释

不难看出其实上述步骤的核心就是用了一个xpath中的string()方法,那么这是一个什么方法呢?和我们平使用的text()方法有什么区别呢?

名称 说明
string() 返回所指元素的所有子节点文本内容所拼接的一个字符串
text() 返回所指元素的文本内容

string(.)中的.就是指的是当前元素啦,那么逐个遍历父元素,然后对他进行xpath语法string(,),获得的不就是当前节点所有子节点的文本了吗~

捋一捋哦~

四、结语

感谢各位大大的耐心阅读~

创作不易,少侠请留步哇!人说,萍水相逢,你我遇见皆是缘分,不如点个赞再走呗?????

lxml中xpath获取当前节点所有子节点的文本方法

原文:https://www.cnblogs.com/AllenMi/p/14320887.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!