2013-08-06 20 views
1

好吧,我使用PHP從網頁中抓取一些數據,並以某種方式拉入源文檔中不存在的某些意外字符。我想這是因爲我解釋了錯誤的字符編碼,雖然我不能確定如何解決這個問題使用PHP刮頁面會導致意想不到的字符

這裏是HTML的給我的錯誤

<tr> 
    <td>Aug 2013</td> 
    <td>TEDxColbyCollege</td> 
    <td> 
     <a href="/talks/daniel_h_cohen_for_argument_s_sake.html">Daniel H. Cohen: For argument’s sake</a>  </td> 
    . 
    . 
    . 
// more of the table 

現在得到的字符串我附和/存儲在一個試片DB是這樣的:Daniel H. Cohen: For argumentâÂÂs sake

我使用下面的代碼加載HTML文檔和刮

$html = file_get_contents('url_of_html_page_being_scrapped'); 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$sxml = simplexml_import_dom($doc); 
$table = $sxml->xpath('//table'); 
foreach($tbl->tr as $vid) 
{ 
. 
. 
echo $vid->td[2]->a // line giving me the problem 
. 
. 
} 

頭的文件表明

<!doctype html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
. 
. 
</head> 

所以我假設我的方法不正確解釋的字符集,雖然我不確定我怎麼可以指定這個,或者如果它甚至問題...也似乎發生在錯誤值:'任何洞察到發生了什麼/我該如何解決它會爲我不確定是真棒

更新後從@Patrick曼瑟一些建議,我試圖解決在SO別處找到

主要有:

$html =stripslashes(mb_convert_encoding(file_get_contents('http://www.ted.com/talks/quick-list?sort=date&order=desc&page=1'), "HTML-ENTITIES", "UTF-8")); 
//AND 
$html = mb_convert_encoding(file_get_contents('http://www.ted.com/talks/quick-list?sort=date&order=desc&page=1'), "HTML-ENTITIES", "UTF-8"); 

兩個導致輸出出現像這樣Daniel H. Cohen: For argument’s sake

+0

'$ html = file_get_contents('url_of_html_page_being_scrapped');'是那個頁面,你把''? –

+0

不,我沒有把任何東西放在'url_of_html_page_being_scrapped'文件的頭部,如上面顯示爲<!doctype html> 。 。 ' – brendosthoughts

+0

這就是我的意思:)嗯,我不知道這是否會爲你工作,但我有類似的問題,並在內容被加載的UTF8_encode()做了竅門。我不知道這是否是一個不正當的黑客...但嘗試它:'$ doc-> loadHTML(utf8_encode($ html));' –

回答

1

雖然在HTML的頭部用這條線在我的數據庫表中迴盪,以及當文本仍然出現配置錯誤文件(在顯示數據時顯示)'正確渲染

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

即使有適當的應用htmlspecialchars_decode(),html_entities_decode()mb_convert_encoding(),這個問題很難擺脫。

我使用修改後的SebastiánGrignoli的forceUTF8()函數來完全清理字符串。我知道沒有其他的喜歡它的PHP。

您可以找到函數here on github的一個版本。

如果您確實需要全面清理,無論涉及什麼字符,這都會帶來驚人的效果。

以下是來自readme的示例。

示例用法:

$utf8_string = Encoding::fixUTF8($garbled_utf8_string); 

實例:

echo Encoding::fixUTF8("Fédération Camerounaise de Football"); 
echo Encoding::fixUTF8("FÃédÃération Camerounaise de Football"); 
echo Encoding::fixUTF8("FÃÃédÃÃération Camerounaise de Football"); 
echo Encoding::fixUTF8("FÃÃÃédÃÃÃération Camerounaise de Football"); 

將輸出:

Fédération Camerounaise de Football 
Fédération Camerounaise de Football 
Fédération Camerounaise de Football 
Fédération Camerounaise de Football 

EDIT

另外,請注意,如果您使用的是基於Web的數據庫瀏覽器(如phpMyAdmin),則可能會遇到DB中存儲的字符編碼與網頁定義的編碼之間的字符差異。我曾經遇到過存儲在數據庫中的情況是完全正確的,但它只是看起來錯誤的界面。

+0

感謝您的建議我試了一下,我仍然沒有得到正確編碼的字符串返回,似乎已經有一個項目打開它的問題,並會留意它在將來可能使用! – brendosthoughts

+0

很高興幫助!另外,如果所討論的問題是[non-break space issue](https://github.com/neitanod/forceutf8/issues/9),我似乎記得使用[unicode preg_replace](http:// www.php.net/manual/en/regexp.reference.unicode.php)將這些字符轉換爲可管理的(即:'preg_replace('/ \ p {Zs} /','',$ htmlString)')。雖然這似乎很奇怪,如果這是你的問題。 – David

相關問題