【问题标题】:HTML tag parsing scriptHTML标签解析脚本
【发布时间】:2016-05-06 07:20:35
【问题描述】:

我编写了一个我认为应该可以工作的 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);

      }
   }
}

【问题讨论】:

  • 你试过使用绝对路径吗?

标签: html perl parsing


【解决方案1】:

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

no_chdir

在递归时不会对每个目录进行 chdir()。 Wanted() 函数当然需要意识到这一点。在这种情况下,$_ 将与 $File::Find::name 相同。

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

【讨论】:

  • 感谢 Sobrique。我尝试了你的建议,仍然得到同样的错误。将“测试”替换为“。”并将 *.html 文件放在我正在运行脚本的目录中不会抛出错误,但也会创建一个 0 字节的解析结果文件。
  • 这是我希望解析的 html: CareerBuilder.com 上夏威夷州檀香山的销售工作。看起来很简单,但我失败得很惨。
  • find() 的回调正在调用另一个子例程,它正在执行shift。我觉得那部分没问题。
  • 好的,我做了更多的工作,发现如果我删除测试目录,我会抛出一个“无法统计测试:没有这样的文件或目录”,我得到了。如果我将目录放回原处,并且脚本中的 *.html 文件运行但 all_tags.csv 不包含数据。我也明白。将我的 2.html 文件放在目录 Test 中会引发错误“打开 Test/2.html 时出错:没有这样的文件或目录”。它调用文件名但说它看不到它?我不明白。我会继续尝试解决问题。欢迎任何想法。
  • OK - 类似的问题。 find 正在做 chdir - 尝试 `Parse_HTML_Header($_)` 或设置 no_chdir
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2012-05-26
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多