【问题标题】:PHP DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: no name in EntityPHP DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: 实体中没有名称
【发布时间】:2012-09-01 22:34:10
【问题描述】:

我试图从某些网页中获取“链接”元素。我无法弄清楚我做错了什么。我收到以下错误:

严重性:警告

消息:DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef:实体中没有名称,行:536

文件名:controllers/test.php

行号:34

代码中的第 34 行如下:

      $dom->loadHTML($html);

我的代码:

            $url = "http://www.amazon.com/";

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    if($html = curl_exec($ch)){

        // parse the html into a DOMDocument
        $dom = new DOMDocument();

        $dom->recover = true;
        $dom->strictErrorChecking = false;

        $dom->loadHTML($html);

        $hrefs = $dom->getElementsByTagName('a');

        echo "<pre>";
        print_r($hrefs);
        echo "</pre>";

        curl_close($ch);


    }else{
        echo "The website could not be reached.";
    }

【问题讨论】:

标签: php html-parsing domdocument


【解决方案1】:

表示部分 HTML 代码无效。 这只是一个警告,而不是错误。您的脚本仍将处理它。禁止设置警告

 libxml_use_internal_errors(true);

或者你可以通过这样做完全抑制警告

@$dom->loadHTML($html);

【讨论】:

  • 你确定你设置了 libxml_use_internal_errors(true);在 php 脚本的顶部?我还更新了我的答案以提供另一种选择
  • 隐藏警告,但返回一个空对象
  • 这很奇怪。我运行了您的确切代码,它运行良好。它返回了一堆对象。您的 print_r 语句输出了 DOMNodeList Object ( [length] => 81 )
  • -1 用于建议抑制该行上的所有错误。这将导致调试噩梦。如果不是这样,我会给你一个 +1。
  • 这是一个糟糕的解决方案,永远不要这样做...... $buf=ob_get_clean() 然后检查 $buf 是否有任何错误输出,这将使您保留错误,但停止浏览器输出
【解决方案2】:

这可能是由流氓&amp;amp; 符号引起的,该符号立即被适当的标记所取代。否则您将收到缺少的; 错误。请参阅:Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,

解决方案是 - 将 &amp;amp; 符号替换为 &amp;amp;
或者,如果您必须拥有 &amp;amp;可能您可以将其包含在:&lt;![CDATA[ - ]]&gt;

【讨论】:

  • 在我的例子中,我输出了一个变量,其中包含 &lt;td&gt; 标记之间的 & 符号,即 $variable['ingredient'] = "7 &amp; 8"; $tbody .= "&lt;td&gt;" . $variable['ingredient'] . "&lt;/td&gt;"; 导致此错误:Message: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: no name in Entity
【解决方案3】:

HTML 格式不正确。如果格式不够好,将 HTML 加载到 DOM 文档中甚至可能会失败。如果 loadHTML 不起作用,那么抑制错误是没有意义的。如果您无法将 HTML 加载到 DOM 中,我建议使用 HTML Tidy 之类的工具来“清理”格式不佳的 HTML。

HTML Tidy 可以在这里找到http://www.htacg.org/tidy-html5/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2012-05-18
    • 2017-01-02
    • 2014-03-10
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多