3 回答

TA貢獻1943條經驗 獲得超7個贊
根據示例輸出,您似乎想要獲取包含指定文本的元素one
。您的描述說您想要該節點的父節點。
基于此假設,您可以使用以下XPath獲得所需的節點:
//*[contains(text(), 'one')]
如果您確實想要此節點的父級,則可以執行
//*[child::*[contains(text(), 'one')]]
順便說一句,如您所見,我使用謂詞來獲取節點,因此我過濾了XML節點。在我看來,這是更合乎邏輯和更易理解的方法,因為它基本上是說給我所有滿足給定條件的節點,而不是說給我所有條件的輸出,然后從這一點開始搜索實際所需的輸出。但是您也可以執行以下操作,以更好地匹配您提出的解決方案:
//text()[contains(., 'one')]/parent::*

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()。
添加回答
舉報