我使用PHP DomDocument + XPath來刮取各種網頁。我發現在某些情況下,DomDocument甚至無法加載HTML,只是返回一個空的結果。例如,頁面包含兩個主體標籤或具有錯誤的DOCTYPE聲明。我試圖用PHP Tidy預處理格式錯誤的HTML,它確實有幫助,但PHP Tidy非常慢!使用PHP DomDocument刮取格式不正確的HTML
我不希望使用任何第三方庫,例如Simple Html Dom Parser
請告知如何處理使用PHP的DomDocument畸形的HTML。我應該在發送到DomDocument之前編寫自定義正則表達式來修復損壞的HTML嗎?也許我錯過了PHP DomDocument的一些設置?
UPD
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://example.com');
$result = curl_exec($ch);
curl_close($ch);
$dom = new DomDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($result);
libxml_clear_errors();
var_dump($dom);
$xpath = new DomXPath($dom);
$nodes = $xpath->query(".//*[@id='content']/ul/li/div[2]/h3/a");
var_dump($nodes); // Nothing
的var_dump($ DOM)的結果;
object(DOMDocument)#25 (34) {
["doctype"]=>
string(22) "(object value omitted)"
["implementation"]=>
string(22) "(object value omitted)"
["documentElement"]=>
NULL
["actualEncoding"]=>
string(5) "UTF-8"
["encoding"]=>
string(5) "UTF-8"
["xmlEncoding"]=>
string(5) "UTF-8"
["standalone"]=>
bool(true)
["xmlStandalone"]=>
bool(true)
["version"]=>
NULL
["xmlVersion"]=>
NULL
["strictErrorChecking"]=>
bool(true)
["documentURI"]=>
NULL
["config"]=>
NULL
["formatOutput"]=>
bool(false)
["validateOnParse"]=>
bool(false)
["resolveExternals"]=>
bool(false)
["preserveWhiteSpace"]=>
bool(true)
["recover"]=>
bool(false)
["substituteEntities"]=>
bool(false)
["nodeName"]=>
string(9) "#document"
["nodeValue"]=>
NULL
["nodeType"]=>
int(13)
["parentNode"]=>
NULL
["childNodes"]=>
string(22) "(object value omitted)"
["firstChild"]=>
string(22) "(object value omitted)"
["lastChild"]=>
string(22) "(object value omitted)"
["previousSibling"]=>
NULL
["attributes"]=>
NULL
["ownerDocument"]=>
NULL
["namespaceURI"]=>
NULL
["prefix"]=>
string(0) ""
["localName"]=>
NULL
["baseURI"]=>
NULL
["textContent"]=>
string(0) ""
}
UPD2。對於DomDocument,重複<body>
即可。有在html領先的空格,加入trim()
$dom->loadHTML(trim($result));
我們可以看到造成它失敗的最短可能的例子嗎?兩個身體標籤是一個相當嚴重的腐敗。這是你唯一需要處理的情況嗎? – halfer
兩個body標籤是可怕的HTML,但有效的XML和DOMDocument可以處理標籤湯。所以,對於DD來說,HTML的一個例子可能太多了,這很有趣。另請參閱我對其他想法的回答。 –
到目前爲止,我有兩種情況 - 重複body標籤錯誤的DOCTYPE,如<!DOCTYPE html xmlns =「http://www.w3.org/1999/xhtml」xmlns:fb =「http://ogp.me/ns/fb#「xmlns:og =」http://ogp.me/ns#「>,但會更多 – ymakux