我首先在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');
?>
有谁知道发生了什么事?谢谢!
答案 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);