XPath在几个相同的div标签中提取文本

时间:2014-07-05 14:40:30

标签: php xpath

我有这个HTML,我希望提取文字bla bla blabla3 bla3 bla3

到目前为止,我已经尝试了这个

//div[@class="s1"]//ul[@class="a1"]//text()[1]')->item(0)->nodeValue; 

但它不起作用。

<div class="s1">
    <ul class="a1">bla bla bla</ul>
    <ul class="a1">bla2 bla2 bla2</ul> 
</div>

<div class="s1">
    <ul class="a1">bla3 bla3 bla3</ul>
    <ul class="a1">bla4 bla4 bla4</ul>
</div>

2 个答案:

答案 0 :(得分:1)

对于您的示例,您可以使用XPath

concat(
 (//div[@class='s1']//ul[@class='a1'][1])[1],
 (//div[@class='s1']//ul[@class='a1'][1])[2]
)

给出了

bla bla blabla3 bla3 bla3

但是你可能已经知道了,并希望为未知数量的元素做这件事。

不幸的是,我认为在纯XPath中不可能,即自动连接多个节点的文本。我最近遇到了类似的情况,并最终使用循环来连接。

更新:如果您有XQuery可用,这很简单:

for $x in //div[@class="s1"]//ul[@class="a1"][1] return $x/text()

如果字符串之间需要空格,可以使用

for $x in //div[@class="s1"]//ul[@class="a1"][1] return concat($x, " ")

答案 1 :(得分:1)

您没有在问题中说出您用来评估XPath表达式的工具,库或应用程序,但是您提到->item(0)->nodeValue表示您正在使用某种语言或其他语言的标准DOM树。所以你需要做的就是使用XPath来提取每个ul class="a1"内的第一个div class="s1",然后取出那个DOM元素的textContent not {{1} },根据元素节点的定义为null。

你需要的XPath就像

nodeValue

评估它将为您提供包含//div[@class="s1"]/ul[@class="a1"][1] 个元素节点的节点列表,每个匹配ul一个节点列表,因此您可以以您的库提供的任何方式迭代该列表并获取{{1}每个节点。

编辑:对于PHP DOMXPath,类似于

div