DOMDocument loadHTML 在服务器上无法正常工作

新手上路,请多包涵

我首先在 MAMP 上运行代码并且运行良好。但是当我试图在另一台服务器上运行代码时,我收到了很多警告,比如:

警告:DOMDocument::loadHTML():意外的结束标记:实体中的头部,第 17 行 /cgihome/zhang1/html/cgi-bin/getPrice.php 中的 3349 警告:DOMDocument::loadHTML():htmlParseStartTag:错位实体中的标签,第 17 行 /cgihome/zhang1/html/cgi-bin/getPrice.php 中的第 3350 行警告:DOMDocument::loadHTML():实体中的标签标头无效,第 3517 行在/cgihome/zhang1/html /cgi-bin/getPrice.php 第 17 行

代码如下:

 <?php
 $amazon = file_get_contents('http://www.amazon.com/blablabla');
 $doc = new DOMdocument();
 $doc->loadHTML($amazon);
 $doc->saveHTML();
 $price = $doc -> getElementById('actualPriceValue')->textContent;
 $ASIN = $doc -> getElementById('ASIN')->getAttribute('value');
?>

任何人都知道发生了什么事?谢谢!

原文由 LuZ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 586
2 个回答

要禁用警告,您可以使用

libxml_use_internal_errors(true);

这对我有用, 手册,继续阅读:


背景: 您正在加载无效的 HTML。无效的 HTML 很常见, DOMDocument::loadHTML 纠正了大部分问题,但默认情况下会发出警告。

使用 libxml_use_internal_errors 您可以控制该行为。在加载文档之前设置它:

 $previously = libxml_use_internal_errors(true);
$doc->loadHTML($amazon);

然后加载后你可以处理错误(如果你想要/需要):

 /* @var LibXMLError[] $xmlErrors */
$xmlErrors = libxml_get_errors();

最后清除它们(因为它们会累加)并恢复以前的设置(如果适用):

 unset($xmlErrors);
libxml_clear_errors();
libxml_use_internal_errors($previously);

参考

原文由 hakre 发布,翻译遵循 CC BY-SA 4.0 许可协议

问题 与非 xHTML 代码有关

由于 DOMdocument () 只能处理 干净的 XHTML ,因此您需要清理代码

Php 有一个扩展可以很好地完成这项工作。名为 Tidy php.net/book.tidy

这可能很棘手,因为您可能需要在 php.ini启用

然后

$tidy_config = array(
                     'clean' => true,
                     'output-xhtml' => true,
                     'show-body-only' => true,
                     'wrap' => 0,

                     );

$tidy = tidy_parse_string( $html, $tidy_config, 'UTF8');
$tidy->cleanRepair();
$doc = new DOMdocument();
$doc->loadHTML( (string) $tidy);

原文由 Pascal 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏