我試圖從div/p頁面上的第一次出現獲取文本,並且只有第一個p。 <p>包含其他標籤(<b>,< a href >)並且從<p>返回的文本在任何其他標籤處停止。是否有辦法讓該行返回<和</>之間的所有文本,即使在嵌入式標籤之間?返回全文元素(包括子元素/後代元素)
puts doc.xpath('html/body/div/p[1]/text()').first
我試圖從div/p頁面上的第一次出現獲取文本,並且只有第一個p。 <p>包含其他標籤(<b>,< a href >)並且從<p>返回的文本在任何其他標籤處停止。是否有辦法讓該行返回<和</>之間的所有文本,即使在嵌入式標籤之間?返回全文元素(包括子元素/後代元素)
puts doc.xpath('html/body/div/p[1]/text()').first
使用:
string((//div/p)[1])
當這個XPath表達式求值的結果是第一p
的是一個div
的子文檔中的字符串值。
按照定義,string value是一個元素的連接(按文檔順序)的所有文本節點的後代。
因此,您可以跳過以此p
元素爲根的子樹中的所有文本,並跳過任何其他節點(元素,註釋,PI)。
XSLT - 基於驗證:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select="string(p)"/>
</xsl:template>
</xsl:stylesheet>
當在下面的XML文檔施加這種轉變:
<p>
Hello <b>
<a href="http://www.w3.org/TR/2008/REC-xml-20081126/">XML</a>
World!</b>
</p>
所評估的結果(沒有這樣的提供!)輸出XPath表達式:
Hello XML
World!
使用引入nokogiri作爲替代更多的XPath,你可以使用Nokogiri::XML::Node#inner_text
:
puts doc.xpath('html/body/div/p[1]').inner_text
感謝Dimitre。應該仔細看看xpath文檔。 – chuckfinley
@chuckfinley:不客氣。 –