0

次の Perl スクリプトは、html ファイルを適切に読み取り、不要なものを取り除きます。また、空白の csv ドキュメントも開きます。

私の問題は、フィールド 1 として名前、フィールド 2 として住んでいて、フィールド 3 としてコメントを使用して、取り除かれた結果を CSV の 3 つのフィールドにインポートしたいことです。

結果は cmd プロンプトに表示されますが、CSV には表示されません。

use warnings; 
use strict;  
use DBI;
use HTML::TreeBuilder;  
use Text::CSV;

open (FILE, 'file.htm'); 
open (F1, ">file.csv") || die "couldn't open the file!";


my $csv = Text::CSV->new ({ binary => 1, empty_is_undef => 1 }) 
    or die "Cannot use CSV: ".Text::CSV->error_diag (); 

open my $fh, "<", 'file.csv' or die "ERROR: $!"; 
$csv->column_names('field1', 'field2', 'field3'); 
while ( my $l = $csv->getline_hr($fh)) { 
    next if ($l->{'field1'} =~ /xxx/); 
    printf "Field1: %s Field2: %s Field3: %s\n", 
           $l->{'field1'}, $l->{'field2'}, $1->{'field3'} 
} 
close $fh; 

my $tree = HTML::TreeBuilder->new_from_content( do { local $/; <FILE> } ); 

for ( $tree->look_down( 'class' => 'postbody' ) ) {
    my $location = $_->look_down
    ( 'class' => 'posthilit' )->as_trimmed_text;     

    my $comment  = $_->look_down( 'class' => 'content' )->as_trimmed_text;
    my $name     = $_->look_down( '_tag'  => 'h3' )->as_text;     

    $name =~ s/^Re:\s*//;
    $name =~ s/\s*$location\s*$//;      

    print "Name: $name\nLives in: $location\nCommented: $comment\n";
} 

html の例は次のとおりです。

<div class="postbody">
    <h3><a href "foo">Re: John Smith <span class="posthilit">England</span></a></h3>
    <div class="content">Is C# better than Visula Basic?</div>
</div>
4

1 に答える 1

10

実際には、CSV ファイルには何も書き込みません。まず、ファイルを書き込み用に開き、後で読み取り用に開く理由が明確ではありません。次に、(現在空になっている) ファイルから読み取ります。次に、HTML から読み取り、必要なコンテンツを表示します。

データを表示したい場合は、CSV ファイルのどこかに書き込む必要があります。

また、Text::CSV を介してファイル ハンドルを使用する場合は、ファイル ハンドルのベアワードを避けるのが最善です。

多分あなたは次のようなものが必要です:

my $csv = Text::CSV->new();
$csv->column_names('field1', 'field2', 'field3');
open $fh, ">", "file.csv" or die "new.csv: $!";
...
# As you handle the HTML
$csv->print ($fh, [$name, $location, $comment]);
...
close $fh or die "$!";
于 2011-07-07T13:31:42.473 に答える