0

<p>.htmlファイルにアクセスして、タグ内のテキストを抽出しようとしています。論理的には、以下の私のコードは機能するはずです。HTML::TreeBuilderを使用する。HTMLを解析してから、<p>find_by_attribute( "p")を使用してテキストを抽出します。しかし、私のスクリプトは空のディレクトリで出てきました。私は何かを省略しましたか?

#!/usr/bin/perl

use strict;
use HTML::TreeBuilder 3;
use FileHandle;

my @task = ('ar','cn','en','id','vn');

foreach my $lang (@task) {
mkdir "./extract_$lang", 0777 unless -d "./extract_$lang";
opendir (my $dir, "./$lang/") or die "$!";
my @files = grep (/\.html/,readdir ($dir));
closedir ($dir);

foreach my $file (@files) {
    open (my $fh, '<', "./$lang/$file") or die "$!";
    my $root = HTML::TreeBuilder->new;
    $root->parse_file("./$lang/$file");
    my @all_p = $root->find_by_attribute("p");
    foreach my $p (@all_p) {
        my $ptag = HTML::TreeBuilder->new_from_content ($p->as_HTML);
        my $filewrite = substr($file, 0, -5); 
        open (my $outwrite, '>>', "extract_$lang/$filewrite.txt") or die $!;
        print $outwrite $ptag->as_text . "\n";  
        my $pcontents = $ptag->as_text;
        print $pcontents . "\n";
        close (outwrite);
    }
close (FH);
}
}

私の.htmlファイルは.aspWebサイトからのプレーンテキストhtmlです(例:http: //www.singaporemedicine.com/vn/hcp/med_evac_mtas.asp)

私の.htmlファイルは次の場所に保存されます:

./ar/*
./cn/*
./en/*
./id/*
./vn/*
4

4 に答える 4

5

要素と属性を混同しています。プログラムはもっと簡潔に書くことができます:

#!/usr/bin/env perl
use strictures;
use File::Glob qw(bsd_glob);
use Path::Class qw(file);
use URI::file qw();
use Web::Query qw(wq);
use autodie qw(:all);

foreach my $lang (qw(ar cn en id vn)) {
    mkdir "./extract_$lang", 0777 unless -d "./extract_$lang";
    foreach my $file (bsd_glob "./$lang/*.html") {
        my $basename = file($file)->basename;
        $basename =~ s/[.]html$/.txt/;
        open my $out, '>>:encoding(UTF-8)', "./extract_$lang/$basename";
        $out->say($_) for wq(URI::file->new_abs($file))->find('p')->text;
        close $out;
    }
}
于 2011-12-19T13:26:32.410 に答える
3

find_by_tag_nameではなく、タグ名を検索するために使用しますfind_by_attribute

于 2011-12-19T13:05:12.267 に答える
3

あなたが欲しいfind_by_tag_name、ではないfind_by_attribute

my @all_p = $root->find_by_tag_name("p");

ドキュメントから:

$ h-> find_by_tag_name('tag'、...)

リストコンテキストでは、指定されたタグ名のいずれかを持つ$h以下の要素のリストを返します。スカラーコンテキストでは、そのような要素が最初に見つかった(ツリーのプレオーダートラバーサルで)を返します。存在しない場合はundefを返します。

于 2011-12-19T13:05:21.453 に答える
1

CSSセレクターを使用できるMojo::DOMを確認することをお勧めします。

于 2011-12-19T15:34:03.280 に答える