【问题标题】:PHP DOMDocument / XPath: Get HTML-text and surrounded tagsPHP DOMDocument / XPath:获取 HTML 文本和被包围的标签
【发布时间】:2011-10-24 11:45:55
【问题描述】:

我正在寻找这个功能:

给出的是这个 html 页面:

<body>
 <h1>Hello,
  <b>world!</b>
 </h1>
</body>

我想得到一个只包含 DISTINCT 文本元素的数组 (没有重复)和围绕文本元素的标签数组:

上述“html”的结果将是一个如下所示的数组:

array => 
 "Hello," surrounded by => "h1" and "body"
 "world!" surrounded by => "b", "h1" and "body"

我已经这样做了:

$res=$xpath->query("//body//*/text()");

这给了我不同的文本内容,但省略了 html 标记。

当我这样做时:

$res=$xpath->query("//body//*");

我得到重复的文本,每个标签星座一个:例如:“世界!”会出现3次, “body”一次,“h1”一次,“b”一次,但我似乎无法 获取哪些文本实际上是重复的信息。只是检查重复的文本是 还不够,因为重复的文本有时只是以前文本或网站的子字符串 可能包含真正的重复文本,然后将其丢弃,这是错误的。

我该如何解决这个问题?

非常感谢!!

托马斯

【问题讨论】:

  • 我认为您需要 xquery。无论如何,在 HTML 上使用 XML 技术并不好。 html 可能格式不正确,因此会出现解析错误。
  • @AurelioDeRosa DOM 可以解析损坏的 HTML
  • 您尚未接受答案。您能否澄清您在答案中寻找的内容以及为什么给定的答案不让您满意。

标签: php html parsing tags domdocument


【解决方案1】:

您可以遍历 parentNodesDOMText 节点:

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$textNodes = array();
foreach($xpath->query('/html/body//text()') as $i => $textNode) {
    $textNodes[$i] = array(
        'text' => $textNode->nodeValue,
        'parents' => array()
    );
    for (
        $currentNode = $textNode->parentNode;
        $currentNode->parentNode;
        $currentNode = $currentNode->parentNode
    ) {
        $textNodes[$i]['parents'][] = $currentNode->nodeName;
    }
}
print_r($textNodes);

demo

请注意,loadHTML 将添加隐含元素,例如它将添加 html 和 head 元素,您在使用 XPath 时必须考虑这些元素。另请注意,用于格式化的任何空格都被视为 DOMText,因此您可能会获得比预期更多的元素。如果您只想查询非空 DOMText 节点,请使用

/html/body//text()[normalize-space(.) != ""]

demo

【讨论】:

    【解决方案2】:

    在您的示例代码中,$res=$xpath-&gt;query("//body//*/text()")DOMNodeListDOMText 节点。对于每个DOMText,您可以通过parentNode 属性访问包含元素。

    【讨论】:

    • 啊,好主意,我刚试了一下,确实可以访问 parentNode,所以我可以手动遍历所有“更高”节点以获取周围的标签。唯一的缺点可能是性能。也许还有另一种方法可以在一次运行中完成,因此可能更有效。但是,您的一个好主意,我要感谢您,现在将对其进行测试以查看其性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2010-12-08
    • 2017-09-07
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多