几天前我问了一个关于使用 PERL 从文件中剥离 HTML 的问题。我是 n00b 并且我已经在网站上搜索了我的问题的答案...但不幸的是我找不到任何东西...这可能是因为我是 n00b 并且当我是时我没有看到答案看着它。
所以,情况就是这样。我有一个包含大约 20 GB 文本文件的目录。我想从每个文件中剥离 HTML 并将每个文件输出到一个唯一的文本文件。我已经编写了下面的程序,它似乎可以解决目录中的前 12 个文本文件(总共大约 12,000 个文本文件)......但是......我遇到了一些障碍。第一个问题是,在解析第 12 个文本文件之后,我开始收到有关深度递归的警告……然后不久程序就退出了,因为我的内存不足。我想我的编程效率极低。所以,我想知道你们中是否有人看到我的代码有任何明显的错误,这会导致我内存不足。...一旦我弄清楚了,希望我能做出贡献。
#!/usr/bin/perl -w
#use strict;
use Benchmark;
#get the HTML-Format package from the package manager.
use HTML::Formatter;
#get the HTML-TREE from the package manager
use HTML::TreeBuilder;
use HTML::FormatText;
$startTime = new Benchmark;
my $direct="C:\\Directory";
my $slash='\\';
opendir(DIR1,"$direct")||die "Can't open directory";
my @New1=readdir(DIR1);
foreach $file(@New1)
{
if ($file=~/^\./){next;}
#Initialize the variable names.
my $HTML=0;
my $tree="Empty";
my $data="";
#Open the file and put the file in variable called $data
{
local $/;
open (SLURP, "$direct$slash"."$file") or die "can't open $file: $!";
#read the contents into data
$data = <SLURP>;
#close the filehandle called SLURP
close SLURP or die "cannot close $file: $!";
if($data=~m/<HTML>/i){$HTML=1;}
if($HTML==1)
{
#the following steps strip out any HTML tags, etc.
$tree=HTML::TreeBuilder->new->parse($data);
$formatter=HTML::FormatText->new(leftmargin=> 0, rightmargin=>60);
$Alldata=$formatter->format($tree);
}
}
#print
my $outfile = "out_".$file;
open (FOUT, "> $direct\\$outfile");
print FOUT "file: $file\nHTML: $HTML\n$Alldata\n","*" x 40, "\n" ;
close(FOUT);
}
$endTime = new Benchmark;
$runTime = timediff($endTime, $startTime);
print ("Processing files took ", timestr($runTime));