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

时间:2012-08-05 19:55:48

标签: php dom

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

  

警告:DOMDocument :: loadHTML():意外的结束标记:头部在实体中,   第17行/cgihome/zhang1/html/cgi-bin/getPrice.php中的行:3349   警告:DOMDocument :: loadHTML():htmlParseStartTag:错误放置的标签   实体,行:/cgihome/zhang1/html/cgi-bin/getPrice.php上的3350   第17行警告:DOMDocument :: loadHTML():标签头无效   实体,行:3517 in /cgihome/zhang1/html/cgi-bin/getPrice.php on   第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');
?>

有谁知道发生了什么事?谢谢!

3 个答案:

答案 0 :(得分:107)

要禁用警告,您可以使用

libxml_use_internal_errors(true);

这对我有用。 Manual

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

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

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

答案 1 :(得分:5)

问题与非 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);

答案 2 :(得分:3)

你可以像这样压制警告:

@$doc->loadHTML($amazon);