【问题标题】:HTML tag parsing and write to file with Perl [closed]使用 Perl 解析 HTML 标记并写入文件 [关闭]
【发布时间】:2016-05-06 17:34:02
【问题描述】:

我无法从一个文件中获取多个 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>

我尝试了几种不同的方法,但都没有成功。

我总是可以从 and 中提取内容,但永远不能从 and 中提取内容。在 HTML 文件前面会导致它看不到内容。现实生活中的 HTML 文件与我编造的文件似乎也很难。

【问题讨论】:

  • 首先,问题是什么?其次,请创建一个minimal reproducible example,突出显示您遇到的任何问题。
  • 根据上述要求,专注并保持简短和甜蜜。
  • @tlialin 我尝试在您的帖子末尾正确格式化 for 循环。请查看它,因为我在此过程中删除了一个},这看起来像是一场意外。
  • 我将问题回滚到修订版 4,这是它开始变异之前的原始问题。
  • @tlialin 请停止对问题进行大量代码更改 -- 如果您有新问题,请使用“提问”按钮。

标签: html perl parsing


【解决方案1】:

您的 HTML 无效。 (&lt;description&gt;&lt;keyword&gt; 不是有效元素。)

use strict;
use warnings;

use HTML::HeadParser;
use HTTP::Headers;

my $text = <<'EOF';
<head>
  <meta charset="utf-8">
  <title>Foo Bar Baz</title>
  <meta name="description" content="foo">
  <meta name="author" content="bar">
</head>
EOF

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

for ($h->header_field_names) {
    printf("%s: %s\n", $_, $h->header($_));
}

输出:

Title: Foo Bar Baz
X-Meta-Author: bar
X-Meta-Charset: utf-8
X-Meta-Description: foo

更新

如果您想创建一个 CSV 文件,use 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

关于迭代多个输入文件并打印到不同的文件句柄的部分由您来完成。

【讨论】:

  • 好的,无效元素我可以得到。我看到了您的输出,这很好,但我只想要某些标签,例如标题和元描述以及元作者。我可以从您提供的内容中写入文件并对其进行正则表达式,但我不知道如何一次完成所有操作。我还必须承认我无法让写入文件部分工作。我试过:我的 $h = HTTP::Headers->new;我的 $p = HTML::HeadParser->new($h); $p->解析($文本); for ($h->header_field_names) { print ($fh1, "%s: %s\n", $_, $h->header($_)); } } 没有运气。
  • 我不知道你期望的输出格式是什么样的。
  • 当然,抱歉。 CSV 文件,每个输入文件一行。类似于:标题、元作者、元描述、,以便有人可以轻松地在 excel 中打开。
  • @tlialin 你不能无限期地扩大问题的范围。如果您有不同的问题,请提出不同的问题。我已将您的问题退回到实际显示您所询问的主要问题的最小代码 sn-p。
  • @tlialin 另请阅读what you should do when someone answers your question。你问了一堆问题但没有接受任何答案,SO 上的一些人会认为这很粗鲁。
猜你喜欢
  • 2015-12-02
  • 1970-01-01
  • 2011-02-14
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多