一、場景還原
現在假定有如下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(,),獲得的不就是當前節點所有子節點的文本了嗎~
捋一捋哦~
四、結語
感謝各位大大的耐心閱讀~
創作不易,少俠請留步哇!人說,萍水相逢,你我遇見皆是緣分,不如點個贊再走唄。◕ᴗ◕。