2012-04-16 15 views
2

私はwwwページをダウンロードするスクリプトを持っています。テキストを抽出し、一様なエンコーディング(UTF8はうまくいくでしょう)で保存したいと思います。ダウンロード(UserAgent)、解析(TreeBuilder)、テキスト抽出はうまくいくようですが、正しく保存しているかどうかはわかりません。Perlエンコーディング - ファイルをUTF8に保存

たとえば、notepad ++のように出力ファイルを開くと表示されません。元のHTMLビューは、テキストエディタで検索されます。

HTMLファイルは、通常 のcharset =ウィンドウ-1256または 文字セットを持っている= UTF8

私は仕事にUTF8 1を得ることができるのであれば、私はそれだけで再符号化の問題だった、考え出し。ここでは、HTMLファイルをディスクに保存していると仮定して、試したことがあります。

my $tree = HTML::TreeBuilder->new; 
$tree->parse_file("$inhtml"); 
$tree->dump; 

のみテキストエディタでUTF8にエンコードを切り替え 後.txtファイルに正しくSTDOUTビューのために撮影したダンプからの出力...

$formatter = HTML::FormatText->new(leftmargin => 0, rightmargin => 50); 
if (utf8::is_utf8($formatter->format($tree))) { 
    print " Is UTF8\n"; 
} 
else { 
    print " Not UTF8\n"; 
} 

結果は、コンテンツがそれを言うとき、これはUTF8であることを示していますそれ以外の場合はUTF8ではありません。

私は疲れて

opening an file with ">" and ">:utf8" 
binmode(MYFILE, ":utf8"); 
encode("utf8", $string); (where string is the output of formatter->format(tree)) 

を持っている。しかし、何も正しく動作していないようにみえます。

何人かのエキスパートが、欠落していることを知っていますか?

ありがとうございます!

答えて

2

この例では、あなたが必要なものを見つけるためにあなたを助けることができる:問題は入力エンコーディングであるよう

use strict; 
use warnings; 
use feature qw(say); 
use HTML::TreeBuilder qw(); 
use Object::Destroyer qw(); 

open(my $fh_in, "<:encoding(cp1252)", $ARGV[0]) or die $!; 
open(my $fh_out, ">:encoding(UTF-8)", $ARGV[1]) or die $!; 

my $tree = Object::Destroyer->new(HTML::TreeBuilder->new(), 'delete'); 
$tree->parse_file($fh_in); 

my $h1Element = $tree->look_down("_tag", "h1"); 
my $h1TrimmedText = $h1Element->as_trimmed_text(); 
say($fh_out $h1TrimmedText); 
+0

が見えます。私は、perlが何かを読んでいたので仮定しました。もしUTF-8なら、正しく読んでいたでしょう。明らかにそうではありません!このコードは役に立ちました....今、各ファイルタイプのエンコーディングを把握するだけです! content_typeタグがある場合、それは簡単ですが、そうでなければ...?それを自動的に行う方法はありますか? – TerpFan

+0

@TerpFan - 私のコードでは正しい入力エンコーディングを選択できるので、その入力のエンコーディングが分かっていればうまくいくはずです。エンコーディングタイプが指定されていない場合は、デフォルトの読み込みエンコーディングにする必要があります。私の答えがあなたを助けてくれることを願います。もしそうなら、私の答えを受け入れてください(私の答えの横にある数字の下のチェックマークをクリックしてください - それは緑色に変わります)。ありがとう、幸運! –

+0

ありがとうございます。私はHTMLファイルを扱っていたので、最初に開いてエンコーディングを見つけてから、正しく再オープンできました!それは鍵です.....私は、最初の場所でファイルを正しく開いたと仮定しました。\t if($ fileline =〜m/charset =(\ S +)\ "/){ \t \t $ charset = $ 1 ; – TerpFan

-3

私は本当にモジュールutf8::allが好きです(残念ながらコアにはありません)。

ちょうどuse utf8::allあなたはUTF-8ファイルでのみ作業するときに、IOに関する心配はありません。

関連する問題