2014-07-05 46 views
0

我有这个html,我希望提取文本bla bla blabla3 bla3 bla3XPath提取几个相同的div标签内的文本

到目前为止,我已经尝试此

//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> 

回答

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中是可能的,也就是说,自动连接多个节点的文本。最近我遇到了类似的情况,并最终使用循环来连接。

UPDATE:如果有可用的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, " ") 
+0

我可以使用查询这样做呢? – user3807890

+0

@ user3807890,是的,请参阅编辑。 – harpo

1

你不说您正在使用什么样的工具,库或应用程序来评估XPath表达式,但提及->item(0)->nodeValue表明您正在使用某种语言或其他语言的标准DOM树。因此,您需要做的是使用XPath提取每个div class="s1"中的第一个ul class="a1",然后取该DOM元素的textContent而不是nodeValue,根据定义元素节点为空)。

你需要将中的XPath像

//div[@class="s1"]/ul[@class="a1"][1] 

评估,会给你包含ul元素节点,每个匹配div节点列表,让你然后在以任何方式你的库,列表迭代提供并采取每个节点的textContent

编辑:对于PHP DOMXPath这将是像

$nodelist = $xpath->query('//div[@class="s1"]/ul[@class="a1"][1]'); 
foreach($nodelist as $node) { 
    echo $node->textContent . "\n"; 
} 
+0

即时通讯在php中使用xpath查询 – user3807890