【发布时间】:2011-12-25 10:40:27
【问题描述】:
我想将网站解析为 Perl 数据结构。 首先我加载页面
use LWP::Simple;
my $html = get("http://f.oo");
现在我知道了两种处理方法。 首先是正则表达式和模块。
我从阅读HTML::Parser 开始,并找到了一些示例。 但是根据 Perl 知识,我不太确定。
我的代码示例继续
my @links;
my $p = HTML::Parser->new();
$p->handler(start => \&start_handler,"tagname,attr,self");
$p->parse($html);
foreach my $link(@links){
print "Linktext: ",$link->[1],"\tURL: ",$link->[0],"\n";
}
sub start_handler{
return if(shift ne 'a');
my ($class) = shift->{href};
my $self = shift;
my $text;
$self->handler(text => sub{$text = shift;},"dtext");
$self->handler(end => sub{push(@links,[$class,$text]) if(shift eq 'a')},"tagname");
}
我不明白为什么会有两次轮班。第二个应该是自指针。但第一个让我认为自引用已经是 shiftet,用作哈希,href 的值存储在$class 中。有人可以解释一下这条线(my ($class) = shift->{href};)吗?
除此之外,我不想解析所有的 URL,我想将 <div class ="foo"> 和 </div> 之间的所有代码放入一个字符串中,其中有很多代码,特别是其他 <div></div> 标记。所以我或一个模块必须找到正确的结束。
之后我打算再次扫描字符串,找到特殊的类,比如<h1>,<h2>, <p class ="foo2"></p>等。
我希望这些信息可以帮助你给我一些有用的建议,并且请记住,首先我想要一个简单易懂的方法,这在第一级不一定是一个很好的表现!
【问题讨论】:
-
不要使用正则表达式! HTML 不正常!
-
看到有人使用 HTML 解析器而不是正则表达式来解析 HTML 多么令人耳目一新:p +1 只是为了那个
-
FWIW:
my ($class) = shift->{href};href 哈希成员。本来可以写成my $ref = shift; my $class = $ref->{"href"}; -
HTML::Parser是必需的吗?使用实现标准 DOM 方法的东西(例如HTML::TagParser),您可能会简化很多。 -
但是
href来自哪里?首先我认为@_[0]是shiftet。它是一个刚刚获得子程序名称的字符串。然后我猜它可能是一个标量变量$foo,它是一个指针。但是下一行会将@_[1]放入$self,这对我来说没有意义。