1

是否有任何简单的方法可以将 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');

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

4

2 回答 2

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的信息。

于 2013-08-07T13:44:56.047 回答
1

Mojo::DOM( docs 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,它会生成与您描述的数据结构相似的数据结构。

于 2013-08-07T14:01:15.987 回答