2

Web サイトから静的な html ページをスクレイピングして個々のファイルに書き込む perl スクリプトは機能しているように見えますが、多くのインスタンスwide character in print at ./script.pl line nをコンソールに出力します。スクレイピングされたページごとに 1 つです。

ただし、生成された html ファイルを少し見ただけでは、スクレイピングに明らかな間違いは見当たりません。問題のある文字を見つけて修正するにはどうすればよいですか? 私はそれを修正することさえ気にする必要がありますか?

関連するコード:

use WWW::Mechanize;
my $mech = WWW::Mechanize->new;   
...
foreach (@urls) {
    $mech->get($_); 
    print FILE $mech->content;  #MESSAGE REFERS TO THIS LINE
...

これは Perl 5.8.8 の OSX 上にあります。

4

2 に答える 2

2

画像などをクロールしていると思いますが、追加することで問題を回避できますbinmode(FILE); または、それらが Web ページで UTF-8 の場合は、 を試してくださいbinmode( FILE, ':utf8' )。詳細についてperldoc -f binmodeは、perldoc perlopentut、 、およびperldoc PerlIOを参照してください。

「:bytes」、「:crlf」、「:utf8」、および「:...」形式のその他のディレクティブは、I/O レイヤーと呼ばれます。「open」プラグマを使用して、デフォルトの I/O レイヤーを確立できます。開くを参照してください。

FILEHANDLE を UTF-8 としてマークするには、「:utf8」または「:encoding(utf8)」を使用します。「:utf8」は、それ以上のチェックなしでデータを UTF-8 としてマークするだけですが、「:encoding(utf8)」は、データが実際に有効な UTF-8 であるかどうかをチェックします。詳細については、PerlIO::encoding を参照してください。

于 2010-07-29T16:57:31.660 に答える
2

事後にファイルを修正したい場合は、ファイルをfix_latinにパイプして、それらがすべて UTF-8 であることを確認します (入力が既に ASCII、Latin-1、CP1252、または UTF-8 の混合物であると仮定します)。 )。

将来的には$mech->response->decoded_content、Web サーバーが使用するエンコーディングに関係なく、UTF-8 を提供する which を使用できます。これbinmode(FILE, ':utf8') に書き込む前に、Perl の内部文字列表現が出力時に厳密な UTF-8 バイトに変換されるようにします。

于 2010-07-29T21:40:51.847 に答える