我试图从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:不客气。 –