2012-08-05 125 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);