如何将HTML文件转换为Perl中的哈希?

时间:2013-08-07 13:39:44

标签: perl html-parsing perl-module

有没有简单的方法将HTML文件转换为Perl哈希?例如,一个工作的Perl模块或什么?

我在cpan.org上搜索,但没找到任何可以做我想要的东西。我想做这样的事情:

use Example::Module;
my $hashref = Example::Module->new('/path/to/mydoc.html');

在此之后我想引用第二个div元素:

my $second_div = $hashref->{'body'}->{'div'}[1];
# or like this:
my $second_div = $hashref->{'body'}->{'div'}->findByClass('.myclassname');
# or like this:
my $second_div = $hashref->{'body'}->{'div'}->findById('#myid');

对此有什么可行的解决方案吗?

2 个答案:

答案 0 :(得分:4)

HTML::TreeBuilder::XPath为您提供的功能远远超过简单哈希。

从概要:

  use HTML::TreeBuilder::XPath;
  my $tree = HTML::TreeBuilder::XPath->new;
  $tree->parse_file( "mypage.html");
  my $nb=$tree->findvalue('/html/body//p[@class="section_title"]/span[@class="nb"]');
  my $id=$tree->findvalue('/html/body//p[@class="section_title"]/@id');
  my $p= $html->findnodes('//p[@id="toto"]')->[0];

  my $link_texts= $p->findvalue( './a'); # the texts of all a elements in $p

  $tree->delete; # to avoid memory leaks, if you parse many HTML documents 

更多关于XPath

答案 1 :(得分:1)

Mojo::DOMdocs found here)构建一个简单的DOM,可以用CSS选择器样式访问:

# Find
say $dom->at('#b')->text;
say $dom->find('p')->pluck('text');
say $dom->find('[id]')->pluck(attr => 'id');

如果您使用的是xhtml,您还可以使用XML::Simple,它会生成与您描述的数据结构类似的数据结构。