Получить результаты для записи в CSV с помощью Perl
Следующий скрипт на Perl сейчас читает html-файл и удаляет то, что мне не нужно. Это также открывает документ CSV, который является пустым.
Моя проблема в том, что я хочу импортировать урезанные результаты в 3 поля CSV, используя Имя в качестве поля 1, Живет в качестве поля 2 и комментирует в качестве поля 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>
1 ответ
Вы на самом деле ничего не пишите в файл 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 "$!";