选择nodeValue但排除子元素
假设我有以下代码:
<p dataname="description">
Hello this is a description. <a href="#">Click here for more.</a>
</p>
如何选择 p
的 nodeValue 但排除 a
及其内容?
我当前的代码:
$result = $xpath->query("//p[@dataname='description'][not(self::a)]");
我通过 $result->item(0)->nodeValue;
选择它
Let's say I have this code:
<p dataname="description">
Hello this is a description. <a href="#">Click here for more.</a>
</p>
How do I select the nodeValue of p
but exclude a
and it's content?
My current code:
$result = $xpath->query("//p[@dataname='description'][not(self::a)]");
I select it by $result->item(0)->nodeValue;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
只需将 /text() 附加到您的查询中就可以解决问题
Simply appending /text() to your query should do the trick
不确定 PHP 的 XPath 是否支持这一点,但是这个 XPath 在 Scrapy(基于 Python 的抓取框架)中为我解决了这个问题:
如果这不起作用,请尝试 Kristoffers 解决方案,或者您也可以使用正则表达式解决方案。例如:
$output = preg_replace("~<.*?>.*?<.*?>~msi", '', $result->item(0)->nodeValue );
这将删除其中包含任何内容的所有 HTML 标记,不包括未由 HTML 标记封装的文本。
Unsure if PHP's XPath supports this, but this XPath does the trick for me in Scrapy (Python based scraping framework):
If this doesn't work, try Kristoffers solution, or you could also use a regex solution. For example:
$output = preg_replace("~<.*?>.*?<.*?>~msi", '', $result->item(0)->nodeValue);
That'll remove any HTML tag with any content in it, excluding text which is not encapsulated by HTML tags.