lxml中xpath獲取當前節點所有子節點的文本方法


一、場景還原

現在假定有如下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(,),獲得的不就是當前節點所有子節點的文本了嗎~

捋一捋哦~

四、結語

感謝各位大大的耐心閱讀~

創作不易,少俠請留步哇!人說,萍水相逢,你我遇見皆是緣分,不如點個贊再走唄。◕ᴗ◕。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM