【问题标题】:How to parse a tricky HTML file, using HTML::TreeBuilder如何使用 HTML::TreeBuilder 解析棘手的 HTML 文件
【发布时间】:2014-10-09 03:06:54
【问题描述】:

假设,我们有以下 HTML 文件:

test.htm

<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <b>weight:</b> 120kg<br>
    <b>length:</b> 10cm<br>
  </body>
</html>

如何从中获取以下数据?

{
'weight' => '120kg',
'length' => '10cm',
}

parser.pl

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use HTML::TreeBuilder;

my $root = HTML::TreeBuilder->new;
$root->parse_file('test.htm');

#what to do here?

$root->delete( );

【问题讨论】:

  • @MiguelPrz 会有什么好处?
  • 恕我直言,这是一个scraping task,您应该使用易于抓取的工具:例如:Web::ScraperMojo::DOM。 HTML::TreeBuilder 级别太低。
  • @jm666 我以前从未使用过它们。会试试的,谢谢。

标签: perl html-parsing


【解决方案1】:

这会让你非常接近你想要的(你需要稍微调整你为键和值获取的文本字符串)。

但我想你会发现使用像 Web:Scraper 这样的工具会简单得多。

#!/usr/bin/env perl

use strict;
use warnings;
use 5.010;

use Data::Dumper;
use HTML::TreeBuilder;

my $root = HTML::TreeBuilder->new;
$root->parse_file(\*DATA);

my $data;

foreach my $elem ($root->find('b')) {
  $data->{($elem->content_list)[0]} = $elem->right;
}

say Dumper $data;

__END__
<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <b>weight:</b> 120kg<br>
    <b>length:</b> 10cm<br>
  </body>
</html>

输出:

$VAR1 = {
          'length:' => ' 10cm',
          'weight:' => ' 120kg'
        };

【讨论】:

  • 但这是错误的方法。我怎么强调都不过分。
  • 我之前说过,像 Web::Scraper 这样的工具。
  • @DaveCross 我还不知道Web::Scraper。您是否愿意添加一个使用它的新解决方案?我几乎觉得这个示例数据太简单了。想出Mojo::DOM 解决方案时遇到了麻烦。
【解决方案2】:

使用Mojo::DOM的两种解决方案:

use strict;
use warnings;

use Mojo::DOM;
use Data::Dump;

my $dom = Mojo::DOM->new(do {local $/; <DATA>});

my %hash = do {
    my $text = $dom->find('body')->all_text();
    split ' ', $text;
};

dd \%hash;

my %hash2 = map {
    $_->all_text() => $_->next_sibling() =~ s{^\s+|\s+$}{}gr
} $dom->find('b')->each;

dd \%hash2;

__DATA__
<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <b>weight:</b> 120kg<br>
    <b>length:</b> 10cm<br>
  </body>
</html>

输出:

{ "length:" => "10cm", "weight:" => "120kg" }
{ "length:" => "10cm", "weight:" => "120kg" }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多