當我使用contains查找元素的text()中數據的存在時,它適用於純數據,但不適用於元素內容中有回車符,新行/標記的情況。如何使//td[contains(text(), "")]
在這種情況下工作?謝謝!如何使用Python在多行文本中搜索XPath中的內容?
XML:
<table>
<tr>
<td>
Hello world <i> how are you? </i>
Have a wonderful day.
Good bye!
</td>
</tr>
<tr>
<td>
Hello NJ <i>, how are you?
Have a wonderful day.</i>
</td>
</tr>
</table>
的Python:
>>> tdout=open('tdmultiplelines.htm', 'r')
>>> tdouthtml=lh.parse(tdout)
>>> tdout.close()
>>> tdouthtml
<lxml.etree._ElementTree object at 0x2aaae0024368>
>>> tdouthtml.xpath('//td/text()')
['\n Hello world ', '\n Have a wonderful day.\n Good bye!\n ', '\n Hello NJ ', '\n ']
>>> tdouthtml.xpath('//td[contains(text(),"Good bye")]')
[] ##-> But *Good bye* is already in the `td` contents, though as a list.
>>> tdouthtml.xpath('//td[text() = "\n Hello world "]')
[<Element td at 0x2aaae005c410>]
感謝您的解釋! //td[text()[contains(.,'Good bye')]]類似於//td[contains(.," Good bye「)],因爲我看到它。選擇這個答案來幫助我和其他人理解這一點! – ThinkCode
@ThinkCode:不客氣。實際上,'//td[contains(.," Good bye「)]'可能會導致誤報,因爲'.'被轉換爲上下文節點的*字符串值*。如果元素具有多個文本節點後代,則所有元素都將連接起來形成其字符串值。如果有兩個連續的文本節點後代,搜索字符串的起始子字符串中的第一個結尾和第二個搜索字符串的其餘部分開始,您可能不希望選中一個元素。 –
嗯,我有點困惑。你能給我們舉一個例子來說明兩種實現之間的區別嗎?非常感謝! – ThinkCode