2012-08-05 88 views
20

我先在MAMP上运行代码,它工作得很好。但是,当我试图到另一台服务器上运行的代码,我得到了很多类似的警告:Dom loadHTML在服务器上无法正常工作

警告:DOM文档:: loadHTML():预期的结束标记:头实体, 行:在3349/cgihome /zhang1/html/cgi-bin/getPrice.php on line 17 警告:DOMDocument :: loadHTML():htmlParseStartTag: 实体中的错位标记,/ cgihome/zhang1/html/cgi-bin/getPrice中的行3350。上 行PHP 17警告:DOM文档:: loadHTML():标签报头无效在 实体,线:在/cgihome/zhang1/html/cgi-bin/getPrice.php 3517上 线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'); 
?> 

任何人都知道这是怎么回事?谢谢!

回答

79

要禁用警告,可以使用

libxml_use_internal_errors(true); 

这对我的作品。 Manual

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

With libxml_use_internal_errors您可以控制该行为。

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

问题已解决。非常感谢! – LuZ 2012-08-05 20:06:22

+0

另外,不要忘记访问手册页,以了解将来会产生一些错误的功能。您经常在那里找到有用的笔记和使用信息。还有用户评论。请参阅['DOMDocument :: loadHTML'](http://de.php.net/DOMDocument.loadHTML) – hakre 2012-08-05 20:09:05

+0

@ user1577801:如果此答案解决了您的问题,请考虑upvoting并接受它,方法是单击下面的大绿色勾号标记答案的分数。 – 2012-08-05 20:12:24

0

问题涉及非的xHTML代码

由于DOM文档()你需要清理你的代码只能处理干净的XHTML:加载文档之前,将它设置

Php有一个扩展,可以很好地完成这项工作。所谓的整洁 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); 
1

您可以surpress这样的警告:

@$doc->loadHTML($amazon);