HTML标记解析脚本

时间:2016-01-28 18:47:44

标签: html perl parsing

我已经编写了一个HTML标记解析脚本,我觉得应该可以正常工作,但是我找不到找不到文件的错误。也许我有一个高级时刻,但我被困住了。我想要在名为Test的目录中解析所有* .html文件,并且我正在从名为temp的文件夹中执行perl脚本,其中包含目录Test。确切的错误是:错误打开Test / 1.html:没有这样的文件或目录。 这是代码:

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;
use HTTP::Headers;
use HTML::HeadParser;
use Text::CSV;


my $csv1 = Text::CSV->new ( { binary => 1 } ) or die Text::CSV->error_diag();
$csv1->eol ("\n");

my $dfile = 'all_tags.csv';
open my $fh1, ">:encoding(utf8)", "$dfile" or die "Error opening $dfile: $!";


my $dir = 'Test';
find (\&HTML_Files, $dir);
print "directory is";
print $dir;
close $fh1 or die "Error closing $dfile: $!";
exit;

sub HTML_Files {
   Parse_HTML_Header($File::Find::name) if /\.html?$/;
}


sub Parse_HTML_Header {

   my $ifile = shift;
   open(my $fh0, '<', $ifile) or die "Error opening $ifile: $!\n";
   my $text = '';
   {
      $/ = undef;
      $text = <$fh0>;
   }
   close $fh0;

   my $h = HTTP::Headers->new;
   my $p = HTML::HeadParser->new($h);
   $p->parse($text);


   for ($h->header_field_names) {
      my @values = split ',', $h->header($_);
      if (/keywords/i) {
         $csv1->print ($fh1, \@values);
      } elsif (/description/i) {
         $csv1->print ($fh1, \@values);
      } elsif (/title/i) {
         $csv1->print ($fh1, \@values);

      }
   }
}

1 个答案:

答案 0 :(得分:1)

这是因为File::Find在运行时正在执行chdir。您应该通过$_而不是$File::Find::name。或者设置no_chdir

  

no_chdir

     

在递归时,每个目录都没有chdir()。当然,want()函数需要注意这一点。在这种情况下,$ _将与$ File :: Find :: name。

相同

因为您指定了相对路径,$File::Find::name也是相对路径。您也可以通过指定find的完整路径来避免这种情况。 (例如/full/path/to/dir