Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Perl解析HTML标记并写入文件_Html_Perl_Parsing - Fatal编程技术网

用Perl解析HTML标记并写入文件

用Perl解析HTML标记并写入文件,html,perl,parsing,Html,Perl,Parsing,我无法从一个文件中获取多个html标记内容。下面是我代码的最后一部分,可以解析文本并将其打印到一个文件中,每个文件读取一行: my $h = HTTP::Headers->new; my $p = HTML::HeadParser->new($h); $p->parse($text); for ($h->header_field_names) { my @values = split ',', $h->header($_);

我无法从一个文件中获取多个html标记内容。下面是我代码的最后一部分,可以解析文本并将其打印到一个文件中,每个文件读取一行:

   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 , /description/i , /title/i) {
         $csv1->print ($fh1, \@values);

      #} elsif (/description/i) {
      #   $csv1->print ($fh1, \@values);
      #} elsif (/title/i) {
      #   $csv1->print ($fh1, \@values);


  }
   }
}
我可以获取第一个标记并将其写入文件,但仅此而已。 最后,我希望得到一个具有多个值的CSV或制表符分隔行

我制作了非常基本的html文件,如下所示

<head><keyword>Test</keyword>
<description>Test2</description>
<title>Test3</title></head>
测试
测试2
测试3
我尝试过几种不同的方法,但都没有成功

我总是可以从中提取内容,但决不能从和中提取内容。在HTML文件前面会导致它看不到内容。现实生活中的HTML文件与我编造的文件相比似乎也很难解决这个问题。

你的HTML是无效的。(
是无效元素。)


更新

如果要创建CSV文件,
使用Text::CSV
并将打印循环更改为如下内容:

my $csv = Text::CSV->new({eol => $/});
my @fields = ('Title', 'X-Meta-Author', 'X-Meta-Description');
$csv->print(*STDOUT, [map { $h->header($_) } @fields]);
产生:

"Foo Bar Baz",bar,foo

我将把迭代多个输入文件并打印到不同文件句柄的部分留给您。

首先,问题是什么?第二,请创建一个突出显示您遇到的任何问题的列表。根据上述请求,请集中并保持简短。@t我试图正确设置您文章结尾处for循环的格式。请检查它,因为我在这个过程中删除了一个
}
,这看起来像是一个意外。我将问题回滚到第4版,这是在问题开始变化之前的原始问题。@t请停止对问题进行大量代码更改-如果您有新问题,请使用“提问”按钮。确定,无效元素我可以得到。我看到你的输出,这是伟大的,但我只想像标题和元描述和元作者某些标签。我可以根据您提供的内容写入一个文件,然后用正则表达式将其输出,但我不知道如何一次完成这一切。我还必须承认,我无法让写入文件部分正常工作。我尝试过:my$h=HTTP::Headers->new;我的$p=HTML::HeadParser->new($h)$p->parse($text);对于($h->header\u field\u names){print($fh1,%s:%s\n,$\uH->header($\u));}没有运气。我不知道您希望输出格式是什么样子。当然,抱歉。CSV文件,每个输入文件一行。类似于:标题、元作者、元描述,这样某人就可以轻松地在excel中打开。@t在这里,你不能无限期地扩大问题的范围。如果你有不同的问题,问不同的问题。我已经将您的问题回滚到最简单的代码段,它实际上展示了您所问的主要问题。@tlialin还阅读了。你问了很多问题而不接受任何答案,有些人因此认为粗鲁无礼。
my $csv = Text::CSV->new({eol => $/});
my @fields = ('Title', 'X-Meta-Author', 'X-Meta-Description');
$csv->print(*STDOUT, [map { $h->header($_) } @fields]);
"Foo Bar Baz",bar,foo