我有以下代码:
<div class = "content">
<table id="detailsTable">...</table>
<div class = "desc">
<p>Some text</p>
</div>
<p>Another text<p>
</div>
我想选择"content"类中的所有文本,我将使用xPath:获得这些文本
doc.xpath('string(//div[@class="content"])')
问题是它选择了所有的文本,包括"table"标记中的文本。我需要从xPath中排除"table"。我该如何做到这一点?
XPath 1.0解决方案:
substring-after(string(//div[@class="content"]),string(//div[@class="content"]/table))
或者只使用concat:
concat(//table/following::p[1]," ",//table/following::p[2])
XPath表达式//div[@class="content"]
选择div
元素-不多也不少-应用string()
函数会得到元素的字符串值,该值是其所有子代文本节点的串联。
在XPath1.0中,除了包含在一个子级中的文本之外,可能无法获取所有文本。使用XPath2.0,它可以作为完成
string-join(//div[@class="content"]/(node() except table)//text(), '')
但对于这种操作,您实际上是在转换而不是纯粹的选择领域,因此您正在扩展XPath的设计范围。