我正在为一些非常糟糕的HTML编写自定义解析器/数据提取器.
更改HTML是不可能的.
我将为您省去我不得不跳过的篮球的细节,但现在已经非常接近我的最初目标.我将DOMDocument getElementByName,正则表达式替换(我知道,我知道…)和XPath查询结合使用.
我需要将所有文本从文档正文中删除.我希望导航至少在抽象中保持独立的实体.这是我现在正在做的事情:
$contentnodes = $xpath->query("//body//*[not(self::a)]/text()|//body//ul/li/a");
foreach ($contentnodes as $contentnode) {
$type = $contentnode->nodeName;
$content = $contentnode->nodeValue;
$output[] = array( $type, $content);
}
这行得通,除了它当然会以不同的方式对待页面上的所有链接外,我只希望它对导航做到这一点.
我可以使用哪种XPath语法,以便在查询的第一部分中|之前,告诉它获取主体子级的所有文本节点(ul>除外). &一种.
请注意,我不能依靠p标记或h1标记或类似的任何明智的方式对内容进行有根据的猜测.
谢谢
更新:@ hr_117的以下答案有效.我还发现您可以使用多个not语句,如下所示:
// body // text()[not(parent :: a / parent :: li / parent :: ul)] [not(parent :: h1)]
解决方法:
您可以尝试如下操作:
//body//text()[not(parent::a/parent::li/parent::ul)]|//body//ul/li/a
标签:xpath,html,php
来源: https://codeday.me/bug/20191123/2065342.html