使用HTML::TreeBuilder从HTML - Perl中提取文本



我试图访问。html文件并提取<p>标记中的文本。从逻辑上讲,下面的代码应该可以工作。使用HTML::TreeBuilder。我解析html,然后使用find_by_attribute("p")在<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文件是来自。asp网站的纯文本html,例如http://www.singaporemedicine.com/vn/hcp/med_evac_mtas.asp

我的。html文件保存在:

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

你混淆了元素和属性。程序可以写得更简洁:

#!/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;
    }
}

使用find_by_tag_name搜索标签名,不使用find_by_attribute

你想要find_by_tag_name,而不是find_by_attribute:

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

From the docs:

h -> find_by_tag_name(‘标签’,……)

在list上下文中,返回$h或$h以下的元素的列表任何指定的标记名。在标量上下文中,返回第一个(在树的预序遍历中)找到这样的元素,或者undef没有。

你可能想看看Mojo::DOM,它允许你使用CSS选择器

相关内容

  • 没有找到相关文章

最新更新