一、场景还原
现在假定有如下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(,),获得的不就是当前节点所有子节点的文本了吗~
捋一捋哦~
四、结语
感谢各位大大的耐心阅读~
创作不易,少侠请留步哇!人说,萍水相逢,你我遇见皆是缘分,不如点个赞再走呗。◕ᴗ◕。