它涉及将.htm重写为.txt(输出文件)
然后使用解析器(stanford语法解析器)(输出文件)
表示目录中的所有文件。
我的问题:我想获取目录中的所有文件,而不是手动完成,并找到运行解析器的方法,而不必为每个文件键入终端。
这是我的代码:
#!/usr/bin/perl
use strict;
use warnings;
use HTML::FormatText;
use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new->parse_file("chpt15Intro.htm");
use HTML::FormatText;
my $formatter = HTML::FormatText->new(leftmargin => 0, rightmargin => 1000);
#print $formatter->format($tree); is replaced by push
push (my @files, $formatter->format($tree));
foreach my $files (@files) {
$files =~ s/^\s+//mg;
open MYFILE, ">ch15Intro.txt";
select MYFILE;
print $files;
}
在终端中,在转换html文件后,我写道:
script parsedch15Intro.txt ./lexparser.csh ch15Intro.txt
保存解析器的输出。这一步仍然需要自动化。
我是初学者,所以感谢您的任何建议。
答案 0 :(得分:2)
尝试用以下代码替换第6行(my $tree = HTML::TreeBuilder->new->parse_file("chpt15Intro.htm");
):
my $tree = HTML::TreeBuilder->new;
$tree->parse_file("chpt15Intro.htm");
HTML :: TreeBuilder的CPAN文档没有提到parse_file
的返回值是什么,如果有的话,但我怀疑它是不该方法被调用的实例上。这意味着在通话结束后,您的$tree
变量没有任何意义。
答案 1 :(得分:1)
您可以使用globbing通过命令行传递多个文件,shell将展开。
./lexparser *.html
所有以'.html'结尾的文件名随后都可在@ARGV
中找到。如果您的脚本只将文件名作为参数,只需循环@ARGV
以获取每个输入文件名,在循环体中处理输入文件。例如:
for my $in (@ARGV) {
my $out = $in;
$out =~ s/(\.html?)?$/.txt/;
...
}
如果希望脚本采用其他选项(例如设置输出文件的扩展名,或为输出文件设置前缀或后缀),请在处理文件之前处理@ARGV
。您可以编写自己的option processor或使用其中一个Getopt
模块。
注意:'。csh'的扩展名表示C shell脚本。对于Perl,如果你想使用扩展名,则使用'.pl'(通常不需要,因为shebang行包含有关脚本类型的信息)。
答案 2 :(得分:1)
我从你的问题中得知,你要做的是将这个脚本应用于某个文件夹中的所有(html-)文件,并输出它们的文本版本。
因此,一个简单的解决方案是简单地用变量替换硬编码的文件名,并围绕@ARGV
循环脚本,例如脚本的参数,如下:
for my $file (@ARGV) {
next unless ($file =~ /^(.+).html*$/i);
my $outfile = $1 . ".txt";
my $tree = HTML::TreeBuilder->new;
$tree->parse_file($file); # credit to Phil for this one
my $formatter = HTML::FormatText->new(leftmargin => 0, rightmargin => 1000);
foreach my $files ($formatter->format($tree)) {
$files =~ s/^\s+//mg;
open my $fh, '>', $outfile or die $!;
print $fh $files;
}
}
如你所见,我清理了一些。像这样使用:
> script.pl *.htm
答案 3 :(得分:0)
不是perl解决方案,但你可以使用这个shell管道进行单线程,
假设
您安装了纯文本浏览器 lynx (可以在mac上使用吗?)
并且系统上有 sh Shell:
ls -1 mydir / * .html | xargs -i sh -c“lynx -dump'{}'>'{}。txt'”
这会在同一目录中创建一堆* .html.txt文件。并且文本可能未根据您的要求进行格式化
答案 4 :(得分:0)
UPDATE :以下是自动化解析器的答案:(类似于TLP和outis'解决方案)
#!/usr/bin/perl
use strict;
use warnings;
for my $file (@ARGV) {
next unless ($file =~ /^(.+).txt*$/i); ##file name ends in txt
my $outfile = "parsed$1".".txt";
qx/script -q \/Users\/jon\/Desktop\/stanford-postagger-full-2011-04-20\/$outfile \.\/lexparser.csh $file/;
}
##First in Terminal cd /Users/jon/Downloads/chpt1-8 or whichever directory this perl script and all texfiles and parser files are
##Called in Terminal by ==> perl auto_parse.pl *.txt
##This saves the output to directory spedicifed. The output is the parsed files
##Required: stanford parser files in same directory as this script