亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python,lxml或etree以獲取包含某些文本的節點的父級

python,lxml或etree以獲取包含某些文本的節點的父級

慕少森 2021-03-30 13:29:34
我如何繼續獲取包含一段文本的節點的父節點?此外,我可以使用一些正則表達式機制作為匹配元素進行搜索/過濾,re.compile("th[ei]s? .ne")例如從下面進行搜索?說 this onehtml = '''<html><head><title></title></head><body><table><tr><td>1a</td><td>2a</td><td>3a</td><td>4a</td><td>5a</td><td>6a</td></tr><tr><td>1b</td><td>2b</td><td>3b</td><td>4b</td><td>5b</td><td>6b</td></tr><tr><td>1c</td><td>2c</td><td>3c</td><td>4c</td><td>5c</td><td>6c this one</td></tr></table><div><div><table><tr><td>1A</td><td>2A</td><td>3A</td><td>4A</td><td>5A</td><td>6A</td></tr><tr><td>1B</td><td>2B</td><td>3B</td><td>4B</td><td>5B</td><td>6B</td></tr><tr><td>1C</td><td>2C</td><td>3C</td><td>4C</td><td>5C</td><td>6C</td></tr></table>this one</div></div></body></html>'''我想有一個返回的迭代器:<td>6c this one</td>進而:<div><table><tr><td>1A</td><td>2A</td><td>3A</td><td>4A</td><td>5A</td><td>6A</td></tr><tr><td>1B</td><td>2B</td><td>3B</td><td>4B</td><td>5B</td><td>6B</td></tr><tr><td>1C</td><td>2C</td><td>3C</td><td>4C</td><td>5C</td><td>6C</td></tr></table>this one</div>我試過:import lxml.htmlroot = lxml.html.document_fromstring(html)root.xpath("//text()[contains(., one)]")和import xml.etree.ElementTree as ETfor e in ET.fromstring(html).getiterator():    if e.text and e.text.find('one') != -1:        print "Found string %r, element = %r" % (e.text, e)但是我可以擁有的最好的節點是包含this one自身的節點...而我正在尋找包含此文本的父節點。請注意,div或表僅作為示例,我真的需要在找到“ this”之后返回到父級,而不是過濾包含的xml元素,this one因為在找到它之前,我將不知道這是div,表還是其他任何東西包含。
查看完整描述

3 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

根據示例輸出,您似乎想要獲取包含指定文本的元素one。您的描述說您想要該節點的父節點。

基于此假設,您可以使用以下XPath獲得所需的節點:

//*[contains(text(), 'one')]

如果您確實想要此節點的父級,則可以執行

//*[child::*[contains(text(), 'one')]]

順便說一句,如您所見,我使用謂詞來獲取節點,因此我過濾了XML節點。在我看來,這是更合乎邏輯和更易理解的方法,因為它基本上是說給我所有滿足給定條件的節點,而不是說給我所有條件的輸出,然后從這一點開始搜索實際所需的輸出。但是您也可以執行以下操作,以更好地匹配您提出的解決方案:

//text()[contains(., 'one')]/parent::*


查看完整回答
反對 回復 2021-04-02
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

>>> root.xpath("//*[contains(child::*/text(), 'one')]") # why empty parent?

[]

該XPath表達式選擇第一個孫文本節點包含“一個”的每個元素。的第一個參數contains()應為字符串,因此XPath接受結果中的第一個節點child::*/text()并采用其字符串值。由于沒有元素的文本節點的第一個孫子節點包含“一個”,因此答案是空的節點列表。


>>> root.xpath("//*[contains(text(), 'one')]")

# i expected to have a list with two elements td and div

[<Element td at 0x280b600>]

出于相同的原因,此XPath表達式選擇其第一個文本節點子代包含“一個”的所有元素。這就是為什么<td>選擇<div>而不選擇的原因:div的包含“一個”的子文本節點不是其第一個子文本節點。


>>> root.xpath("//*[child::*[contains(text(), 'one')]]")

# if parent: expected tr and div,

# if not parent expected table or div, still missing one

[<Element tr at 0x2821f30>]

這面臨著與先前表達式相同的限制。


您是否嘗試過@dirkk提出的最后一個解決方案,


//text()[contains(., 'one')]/parent::*

那應該避免將多個節點作為第一個參數傳遞給您的問題contains()。


查看完整回答
反對 回復 2021-04-02
  • 3 回答
  • 0 關注
  • 537 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號