我有这个HTML,我希望提取文字bla bla bla
和bla3 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>
答案 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