1

わかりましたので、PHP を使用して Web ページからデータをスクレイピングし、ソース ドキュメントに存在しない予期しない文字を何らかの方法で取得しています。これは、問題の解決方法が不明ですが、間違った文字エンコーディングを解釈したことが原因であると思います

これは私にエラーを与える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 Manserからのいくつかの推奨事項の後、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

4

2 に答える 2

1

htmlspecialchars_decode()html_entities_decode()、およびを適切に適用してもmb_convert_encoding()、この問題を取り除くのはかなり困難です。

Sebastián Grignoli のforceUTF8()関数の修正版を使用して、文字列を完全にクリーンアップします。私はphpのようなものを他に知りません。

関数の 1 つのバージョンは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

編集

また、Web ベースの DB ブラウザ (phpMyAdmin など) を使用している場合、DB に格納されている文字エンコーディングと Web ページで定義されているエンコーディングとの間に文字の不一致が発生する可能性があることに注意してください。DB に保存されているものは完全に正しいのに、インターフェイスから見ると間違っているように見えるケースがありました。

于 2013-08-06T20:04:07.117 に答える