如何解决使用 XPath 获取直接子级的文本
我有这部分 HTML 需要解析:
<p>
names: <strong><i>John</i>,<i>Mark</i></strong>
<br>
occupation: <strong>actor</strong>
<br>
</p>
我正在使用 Symfony Dom Crawler 来解析几个页面。我需要 <p>
的直接子级的文本内容。使用我的例子,我想得到的结果是:
[
'names:','John,Mark','occupation:','actor',]
我不知道要使用什么 XPath。我不认为我可以使用 CSS 选择器,因为它完全忽略了文本节点。这是我尝试过的:
$items = $crawler
->filter('p')
->filterXPath('//text()')
->extract(['_text']);
这显然是错误的,因为它需要所有文本节点,无论它们在哪里。我得到的结果是:
[
'names:','John',','Mark','',]
编辑
我设法通过 //p/text()|//p/*
选择器获得了我需要的东西,但我仍在寻找优化版本,其中:
解决方法
我不知道那个库,也没有 PHP 或那个库来测试,但通读 https://symfony.com/doc/current/components/dom_crawler.html#expression-evaluation 对我来说听起来好像你想要,例如
$crawler
->filter('p')
->filterXPath('p/node()')
->evaluate('normalize-space()')
应该选择 p
元素,然后选择 p
元素的任何子节点,然后返回任何这些子节点的规范化字符串值。
根据空格的处理方式,可能需要使用 ->filterXPath('p/node()')
以避免返回的其他文本字符串之间出现空字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。