2012-01-24 65 views
0

我需要從網頁刮一些數據。但是,我有一些高級的編碼問題。PHP DOMXPath編碼

這裏只是一個利特爾示例代碼顯示在德國知名網頁的麻煩。

我預計從網頁得到這樣的文字:
所有的批評者被拉伸的面貌,因爲沃爾夫斯堡沃爾夫的被裏朝外強。科隆可以借鑑他們的利益?

但你可以在我的測試中看到的,我得到這樣的:
所有的批評者被拉長看沃爾夫斯堡,因爲沃爾夫翻過來大力。在Kölner可以借鑑他們的利益?

網頁的meta標籤說,這樣做是爲UTF-8編碼的...所以
而mb_detect_encoding說,這樣做是爲UTF-8。

但爲什麼我得到這個蹩腳的文字回來嗎?

,當我將文本轉換爲ISO 8859-1我得到預期的結果...

<?php 
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'; 

$url = "http://www.goal.com/de/match/60952/wolfsburg-vs-1-fc-k%C3%B6ln/preview"; 

$fileContent = @file_get_contents($url); 

$dom = @DOMDocument::loadHTML($fileContent); 
$xpath = new DOMXpath($dom); 

$element = $xpath->query(".//*[@id='article_headline']/h2"); 
if ($element->length > 0) { 
    $item = $element->item(0); 

    $text = $item->textContent; 
    echo $text . "<br>"; 

    $text = iconv("UTF-8", 'ISO-8859-1', $text); 
    echo $text . "<br>"; 
} 

?> 

回答

12

DOM文檔的HTML解析器(所有這一切是libxml2的)會嘗試猜測輸入的編碼,如果遇到不良HTML。通常它做了不錯的工作,但這個頁面似乎是一個病態的情況。也許東亞字符的存在是混亂的。

在這樣的你有絕對的把握,你知道的編碼,您可以強制文本7位ASCII將其送入loadHTML()方法之前那裏的情況。你可以這樣做,像這樣:

$fileContent = mb_convert_encoding($fileContent, 'HTML-ENTITIES', 'UTF-8'); 

這將所有非ASCII字符轉換成HTML來命名或數字字符實體。該頁面正常工作對我來說當我這樣做。

+0

謝謝,這就是我一直在尋找:) – Urkman

0

頁面本身沒有定義字符集的DOMDocument預期的方式。例如:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

你需要加載之前修補無論是HTML,或者用別的東西(也許是因爲loadXML的它似乎是XHTML文檔中?)。