我过去常常使用XPath。目前我遇到了一个问题,我无法解决这个问题。
约束
HTML的标记
<span class="container">
Peter: Lorem Impsum
<i class="divider" role="img" aria-label="|"></i>
Paul Smith: Foo Bar BAZ
<i class="divider" role="img" aria-label="|"></i>
Mary: One Two Three
</span>
挑战
我想提取三个连贯的字符串:
XPath的
以下XPath查询是我在研究HOURS后得出的最好的:
XPath查询1
//span[contains(@class, "container")]
=> Peter: Lorem ImpsumPaul Smith: Foo Bar BAZMary: One Two Three
XPath查询2
//span[contains(@class, "container")]//text()
Peter: Lorem Impsum Paul Smith: Foo Bar BAZ Mary: One Two Three
问题
虽然之后可以使用(PHP)字符串函数对结果字符串进行后处理,但我无法将其拆分为正确的三个块:我需要一个XPath查询,这使我能够正确区分文本节点。
是否有可能在文本节点之间集成一些“人工分离器”?
你对XPath 1.0的期望太高了。 XPath 1.0本身可以帮助您在这里选择
然后,您将必须在XPath之外完成处理(正如Mads在评论中所建议的那样)。
为了理解你遇到的限制,你的第一个XPath,
//span[contains(@class, "container")]
选择span
元素的节点集。 XPath 1.0正在运行的环境向您显示文档中单个此类节点的字符串值(某些变体):
Peter: Lorem ImpsumPaul Smith: Foo Bar BAZMary: One Two Three
但请注意:您的XPath正在选择span
元素的节点集,而不是字符串。
你的第二个XPath,
//span[contains(@class, "container")]//text()
选择text()
节点的节点集。 XPath 1.0运行的环境显示每个选定的text()
节点的字符串值。
如果你可以使用XPath 2.0,你可以直接在XPath中选择一个字符串序列,
//span[contains(@class, "container")]/text()/string()
或者你可以加入他们,
string-join(//span[contains(@class, "container")]/text(), "|")
并直接得到
Peter: Lorem Impsum
|
Paul Smith: Foo Bar BAZ
|
Mary: One Two Three
要么
string-join(//span[contains(@class, "container")]/text()/normalize-space(), "|")
要得到
Peter: Lorem Impsum|Paul Smith: Foo Bar BAZ|Mary: One Two Three