用Perl刮取HTML文件,只返回内容,按顺序

用Perl刮取HTML文件,只返回内容,按顺序,perl,mojolicious,html-tree,html-treebuilder,mojo-dom,Perl,Mojolicious,Html Tree,Html Treebuilder,Mojo Dom,使用HTML::TreeBuilder——或Mojo::DOM——我希望对内容进行刮取,但保持其有序,以便将文本值放入数组中(然后使用变量替换文本值以用于模板化) 但这在TreeBuilder中 my $map_r = $tree->tagname_map(); my @contents = map { $_->content_list } $tree->find_by_tag_name(keys %$map_r); foreach my $c (@contents) {

使用HTML::TreeBuilder——或Mojo::DOM——我希望对内容进行刮取,但保持其有序,以便将文本值放入数组中(然后使用变量替换文本值以用于模板化)

但这在TreeBuilder中

my $map_r = $tree->tagname_map();

my @contents = map { $_->content_list } $tree->find_by_tag_name(keys %$map_r);

foreach my $c (@contents) {
  say $c;
}
不会返回顺序——当然,散列不会被排序。那么,如何从根开始访问树并保持返回值的顺序呢?递归地在树上行走?基本上,除了每个元素之外,我想使用“as_text”方法。(遵循这一点,但我对所有元素都需要它)

这更好(使用Mojo::DOM):


但是,欢迎任何进一步的评论。

HTML::TreeBuilder的页面/源文件的输入是什么?不是URL,只是本地HTML文件(在磁盘上)。既然您使用的是标记名\u map(),但没有任何参数,不如
my@content=content\u list()
而不是标记名\u map()。应该点这个。看起来很奇怪,因为你在下一行中使用它,但是如果你只想要某些标签,你应该发布它;我试试看。我想要所有的标签,因为我不知道哪一个有文本。这让我不知所措,试图去引用所有的东西。例如:
一些文本now boldextra text

应该是“some text”、“now bold”、“extra text”(引用的数组不是问题,我可以处理),而不是Mojo::DOM为我的$x($DOM->parse($html)->find('*')->用
处理的“some text”、“extra text”、“now bold”){my$text=$x->text;chomp$text;push@text,$text;}
$dom->parse($html)->find('*')->each(
    sub {
        my $text = shift->text;
        $text =~ s/\s+/ /gi;
        push @text, $text;
    }
  );