【问题标题】:parsing html with DOMDocument用 DOMDocument 解析 html
【发布时间】:2011-07-18 08:55:23
【问题描述】:

我正在用 php 中的 DOMDocument 解析 html。

我发现我无法使用 xpath 查询全选。但是 getElementsByTagName() 方法可以正常工作。

代码如下:

$xml = new DOMDocument();
$xml->load("file.html");
$xpath = new DOMXPath($xml);

$links = $xpath->query("//a");
$links2 = $xml->getElementsByTagName("a");

foreach($links as $link){
    echo "<br>$k: ".$link->nodeValue; // this doesn't print the node value. $links is empty
}
foreach($links2 as $link){
    echo "<br>$k: ".$link->nodeValue; // this prints OK the node value
}

我原以为 xpath->query("//a") 会与 getElementsByTagname("a") 相同,但显然不是。

谁能告诉我为什么他们不一样。或者如果是,我在使用 xpath 查询选择节点时做错了什么?

谢谢

【问题讨论】:

  • 感谢您尝试复制。它给了我需要它的提示。我的问题是加载文件时。我需要使用$xml-&gt;loadHTMLfile('file.html') 而不是load() 方法加载。
  • 戈登,由于某种原因,我没有看到将您的评论标记为答案的链接
  • 将我的 cmets 移至答案

标签: php xpath domdocument


【解决方案1】:

无法重现:http://codepad.org/N8BlsQro

如果您想使用loadloadXML,您的标记必须是有效的 X(HT)ML。 HTML 是基于 SGML 的。试试loadHTMLloadHTMLFile

请注意,当您使用loadHTMLloadHTMLFile 时,DOM 将尝试修复任何无效的 HTML,使其可用于 DOM。例如,它会在任何部分 HTML 文档周围添加一个基本的 HTML 框架,这会对您的 XPath 查询产生影响(但在 \\a 的情况下不会)。

【讨论】:

    【解决方案2】:

    试试:

    $links = $xpath->query('//a/@href');
    

    【讨论】:

    猜你喜欢
    • 2012-06-23
    • 2011-10-11
    • 1970-01-01
    • 2013-02-08
    • 2011-02-04
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多