【问题标题】:HTML parsing by perl scriptperl 脚本解析 HTML
【发布时间】:2012-10-26 01:18:46
【问题描述】:

我正在尝试通过我的 perl 脚本解析 HTML 文件。我正在使用一个名为 HTML::TreeBuilder 的模块。

这是我目前所拥有的:

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new; 

$tree->parse_file("sample.html");

foreach my $anchor ($tree->find("p")) {

  print $anchor->as_text, "\n";

}

它工作正常。我在< p> 标签中得到了所有东西。

sample.html 文件:

< td>Release Version:< /td>< td> 5134< /td>< /tr>

< tr class="d0">< td>Executed By:< /td>< td>spoddar< /td>< /tr>

< tr class="d1">< td> Duration:< /td>< td>0 Hrs 0 Mins 0 Secs < /td>< /tr>

< tr class="d0">< td>#TCs Executed:< /td>< td>1< /td>< /tr>

我希望在通过发布版本时打印5134。 以同样的方式,当我通过 Execute By 时,我希望打印 spoddar。 这些不是 HTML 标签。但是有什么办法可以得到呢?

【问题讨论】:

  • 在决定打印什么时是否需要应用任何规则?你也应该打印0 Hrs 0 Mins 0 Secs 吗?

标签: html perl parsing html-parsing perl-module


【解决方案1】:

HTML::ParserHTML::TokeParser 也可能对您有用。


未经测试

use HTML::TokeParser;

my $p = HTML::TokeParser->new('sample.html');

while (my $token = $p->get_token) {
    my $tokenType = shift @{$token}; # 'S' is start tag 'E' end tag etc. (see doc)
    if ($tokenType =~ /S/) {
        my ($tag, $attr, $attrseq, $rawtxt) = @{$token};
        my $class = $attr->{class}; #get tag class
        if ($class =~ /d0/ && $tag =~ /tr/) {
            print "$p->get_trimmed_text('/tr')\n";
        }
    }
}

【讨论】:

    【解决方案2】:

    最直接的做法是过滤您想要的标签并查看文本。以下方法假定您在示例中使用的格式,带有 2 列表。

    sub get_value {
        my $key = shift;
    
        foreach my $tr ($tree->find('tr')) {
            my @td = $tree->find('td');
            return $td[1]->as_text if $td[0]->as_text eq $key;
        }
        return;
    }
    
    print get_value('Release Version:');
    

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2011-06-03
      • 2011-10-10
      相关资源
      最近更新 更多