DOMDocument加载HTML没有';在服务器上无法正常工作


DOMDocument loadHTML doesn't work properly on a server

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

警告:DOMDocument::loadHTML():实体中出现意外的结束标记:head,第17行:3349 in/cgihomezhang1/html/cgi-bin/getPrice.php警告:DOMDocument::loadHTML():htmlParseStartTag:中的错误标记实体,行:3350 in/cgihomezhang1/html/cgi-bin/getPrice.php on第17行警告:DOMDocument::loadHTML():中的标记标头无效实体,行:3517 in/cgihomezhang1/html/cgi-bin/getPrice.php on17号线

代码如下:

<?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');
?>

有人知道发生了什么事吗?谢谢

要禁用警告,可以使用

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);

参考

  • libxml_use_internal_errors禁用libxml错误并允许用户根据需要获取错误信息
  • libxml_clear_errors清除libxml错误缓冲区
  • libxml_get_errors检索错误数组
  • LibXMLError libXMLError类
  • 堆栈溢出对DOMDocument PHP内存泄漏的回答(Tak;2011年12月)

这个问题与非xHTML代码有关

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

Php有一个扩展,可以很好地完成这项工作。被称为Tidyphp.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);

您可以按下以下警告:

@$doc->loadHTML($amazon);