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

2022-08-30 14:20:48

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

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

有人知道发生了什么吗?谢谢!


答案 1

要禁用警告,您可以使用

libxml_use_internal_errors(true);

这对我有用,手册,请继续阅读:


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

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

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

然后加载后,您可以处理错误(如果需要/需要):

/* @var LibXMLError[] $xmlErrors */
$xmlErrors = libxml_get_errors();

最后清除它们(因为它们将加起来)并恢复以前的设置(如果适用):

unset($xmlErrors);
libxml_clear_errors();
libxml_use_internal_errors($previously);

引用


答案 2

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

推荐