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

LuZ*_*LuZ 26 php dom

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

警告:DOMDocument :: loadHTML():意外的结束标记:head in Entity,line:3349 in /cgihome/zhang1/html/cgi-bin/getPrice.php on line 17警告:DOMDocument :: loadHTML():htmlParseStartTag:放错位置实体中的标签,第33行/cgihome/zhang1/html/cgi-bin/getPrice.php中的行:3350警告:DOMDocument :: loadHTML():标签标头在实体中无效,第3517行/ cgihome/zhang1/html第17行/cgi-bin/getPrice.php

代码如下:

<?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');
?>
Run Code Online (Sandbox Code Playgroud)

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

hak*_*kre 113

要禁用警告,您可以使用

libxml_use_internal_errors(true);
Run Code Online (Sandbox Code Playgroud)

这适合我.手册

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

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

libxml_use_internal_errors(true);
$doc->loadHTML($amazon);
Run Code Online (Sandbox Code Playgroud)


Pas*_*cal 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);
Run Code Online (Sandbox Code Playgroud)


Ami*_*ini 5

您可以像这样抑制警告:

@$doc->loadHTML($amazon);
Run Code Online (Sandbox Code Playgroud)