0

私は現在、アジア文字 (簡体字と繁体字の両方の中国語) が含まれる特定のページをスクレイピングするための小さな perl スクリプトを作成しています。私が直面する最初の問題は、Mechanize を使用すると、「ソース」から取得した文字列にワイド文字が含まれていることです。ソースページは既に utf-8 でエンコードされています。以下は、私が使用しているオプションとパッケージです。

use strict ;
use warnings ;
use utf8;
use Encode qw(decode encode);
use File::Path qw(make_path remove_tree);
binmode(STDOUT, ":utf8");
use Win32::Unicode::Dir;

問題なく文字列を印刷できます。しかし、ディレクトリ mkdir を作成しようとすると、ワイド文字または無効な引数が表示されます。それ以来、mkdirW を使用して Win32::Unicode パッケージで回避策を試しました。ディレクトリは正常に作成されていますが、呼び出し時にディレクトリを使用できません:

$mech->get( $url, ':content_file' => $savePath) or die $!;

get コマンドは正常に完了しますが、$savepath のディレクトリは空のままです。この方法は、通常の英数字が含まれる場合に機能します。

フォルダのタイトルの例: 蜂蜜 Honey So

my $savePath = "C:\\" . $title . "\\Picture_of_honey.jpg";
where $title = "蜂蜜 Honey";

ディレクトリを作成してファイルを保存することはできません。エンコードの問題である必要がありますが、utf 8 にエンコードしようとしましたが、既に utf8 でエンコードされているため、元のテキストが文字化けします。デコードすると、ワイド文字エラーが発生します。

4

1 に答える 1

0

openWin32::Unicode::Dir を使用すると、LWP::UserAgent などの他のパッケージに組み込まれているバグのある Perl などを上書きしません。コールバックを使用して:content_cb、自分でファイルに書き込むだけです。

管理下にない外部 Web サイトにシステム上のファイル名を決定させるのは、おそらく良い考えではありません。これはせいぜい煩わしい (多くの文字は Windows ファイル システムでは無効です) か、最悪の場合はセキュリティ上の欠陥です。その罠に陥らず、ドキュメントのタイトルを (データベース/ファイルに) 個別に保存し、コードが生成した安全なファイル名をコンテンツ ドキュメントに付けてください。

于 2013-07-20T18:14:03.547 に答える