我正在尝试访问.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网站的纯文本htmls,例如http://www.singaporemedicine.com/vn/hcp/med_evac_mtas.asp
我的.html文件保存在:
./ar/*
./cn/*
./en/*
./id/*
./vn/*
答案 0 :(得分:5)
你感到困惑element with attribute。该程序可以更简洁地编写:
#!/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;
}
}
答案 1 :(得分:3)
使用find_by_tag_name
搜索标记名称,而不是find_by_attribute
。
答案 2 :(得分:3)
您需要find_by_tag_name
,而不是find_by_attribute
:
my @all_p = $root->find_by_tag_name("p");
来自docs:
$ h-&gt; find_by_tag_name('tag',...)
在列表上下文中,返回$ h或以下的元素列表 任何指定的标签名称。在标量上下文中,返回第一个 (在树的预先遍历中)找到这样的元素,或者如果是undef 无。
答案 3 :(得分:1)
您可能想看看Mojo :: DOM,它允许您使用CSS选择器。