29

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

警告:DOMDocument::loadHTML(): Unexpected end tag : head in Entity, line: 3349 in /cgihome/zhang1/html/cgi-bin/getPrice.php on line 17 警告: DOMDocument::loadHTML(): htmlParseStartTag: misplaced Entity 中的标记,第 17 行 /cgihome/zhang1/html/cgi-bin/getPrice.php 中的第 3350 行警告:DOMDocument::loadHTML(): Entity 中的标记标题无效,行:/cgihome/zhang1/html 中的 3517 /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');
?>

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

4

3 回答 3

130

要禁用警告,您可以使用

libxml_use_internal_errors(true);

这对我有用。手动的

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

libxml_use_internal_errors你可以控制这种行为。在加载文档之前设置它:

libxml_use_internal_errors(true);
$doc->loadHTML($amazon);
于 2012-08-05T20:02:32.117 回答
6

问题与非xHTML代码有关

由于DOMdocument () 只能处理干净的 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);
于 2016-06-15T12:49:37.353 回答
4

您可以像这样隐藏警告:

@$doc->loadHTML($amazon);
于 2016-12-18T00:41:47.667 回答