16

基本上我需要抓取一些具有嵌套标签的文本。

像这样的东西:

<div id='theNode'>
This is an <span style="color:red">example</span> <b>bolded</b> text
</div>

我想要一个能产生这个的表达式:

This is an example bolded text

我已经为此苦苦挣扎了一个小时或更长时间,但没有任何结果。

任何帮助表示赞赏

4

5 回答 5

26

元素节点的字符串值是该元素节点的所有文本节点后代的字符串值按文档顺序串联而成。

您想string()在 div 元素上调用 XPath 函数。

string(//div[@id='theNode'])

您还可以使用normalize-space函数来减少由于源文档中的换行和缩进而可能出现的不需要的空白。这将删除前导和尾随空格,并用单个空格替换空格字符序列。当您将节点集传递给 normalize-space() 时,节点集将首先转换为其字符串值。如果没有参数传递给 normalize-space,它将使用上下文节点。

normalize-space(//div[@id='theNode'])

// if theNode was the context node, you could use this instead
normalize-space()

您可能希望使用比我一直使用的示例 XPath 更有效的方式来选择上下文节点。例如,可以在某些浏览器中针对该页面运行以下 Javascript 示例。

var el = document.getElementById('question');
var result = document.evaluate('normalize-space()', el, null ).stringValue;

span和元素之间的纯空格文本节点b可能是一个问题。

于 2012-05-03T02:13:07.580 回答
2

如果你在 python 中使用 scrapy,你可以使用descendant-or-self::*/text(). 完整示例:

txt = """<div id='theNode'>
This is an <span style="color:red">example</span> <b>bolded</b> text
</div>"""

selector = scrapy.Selector(text=txt, type="html") # Create HTML doc from HTML text
all_txt = selector.xpath('//div/descendant-or-self::*/text()').getall()
final_txt = ''.join( _ for _ in all_txt).strip()
print(final_txt) # 'This is an example bolded text'
于 2019-08-08T03:19:06.140 回答
1

使用

string(//div[@id='theNode'])

当计算这个表达式时,结果是div文档中第一个(希望是唯一的)元素的字符串值。

由于元素的字符串值在XPath 规范中定义为所有文本节点后代的文档顺序连接,因此这正是所需的字符串。

因为这可能包括许多全空白文本节点,所以您可能希望消除连续的前导和尾随空白,并将任何此类中间空白替换为单个空格字符:

使用

normalize-space(string(//div[@id='theNode']))

基于 XSLT 的验证:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  "<xsl:copy-of select="string(//div[@id='theNode'])"/>"
===========
  "<xsl:copy-of select="normalize-space(string(//div[@id='theNode']))"/>"
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<div id='theNode'> This is an 
    <span style="color:red">example</span>
    <b>bolded</b> text 
</div>

计算两个 XPath 表达式,并将这些计算的结果复制到输出

  " This is an 
    example
    bolded text 
"
===========
  "This is an example bolded text"
于 2012-05-03T02:39:26.037 回答
-1

这个怎么样 :

/div/text()[1] | /div/span/text() | /div/b/text() | /div/text()[2]

嗯,我不确定最后一部分。你可能不得不玩那个。

于 2012-05-03T03:24:53.713 回答
-1

普通代码

//div[@id='theNode']

获取所有文本,但如果它们分裂然后

//div[@id='theNode']/text()

不确定,但如果你给我链接,我会试试

于 2020-03-28T19:28:33.097 回答