[PerlChina] perl解析HTML处理成DOM对象的处理
rorot
yang.liana at gmail.com
Mon Nov 26 07:55:20 PST 2007
谢谢诸位, 特别是Qiang, jzhang的热心解答!
我之于Mechanize模块的尝试,实际是出于兴趣。因为对Javascript较熟悉,以前用HTML::TreeBuilder模块时,虽然也可以达到解析HTML文档之目的,然终究想用一套和DOM类似的接口来操作HTML
Syntax Document。
事实上,若要模仿浏览器行为,我想WWW::*模块足以胜任。如jzhang提到的,Mechanize主要提供的是模拟浏览器行为的功能。那么在这里我的疑惑是:
既然有了WWW::*诸如此类模块,那么WWW::Mechanize,
Mozilla::Mechanize存在的目的是什么?我唯一能说服的就是他们提供了和DOM类似的接口。使用起来更熟悉。诸位如何看?
下面附上Mozilla::Mechanize的make test输出结果。在make test失败的情况下,我强制make
install,然后编写了测试Mozilla::Mechanize的代码,运行后脚本崩溃, 提示段错误。
Failed 7/8 tests, 12.50% okay
Failed Test Stat Wstat Total Fail List of Failed
-------------------------------------------------------------------------------
t/00-props.t 0 139 11 20 2-11
t/01-construct.t 0 139 13 24 2-13
t/02-ct.t 0 139 20 38 2-20
t/basic.t 0 139 12 22 2-12
t/field.t 0 139 12 22 2-12
t/find_link.t 0 139 60 118 2-60
t/formbasics.t 0 139 33 64 2-33
t/frames.t 0 139 9 16 2-9
t/image-parse.t 0 139 20 38 2-20
t/jstest.t 0 139 4 6 2-4
t/select.t 0 139 26 50 2-26
t/swaplist.t 0 139 25 48 2-25
t/tick.t 0 139 8 14 2-8
2 tests skipped.
Failed 13/15 test scripts. 240/253 subtests failed.
Files=15, Tests=253, 4 wallclock secs ( 1.97 cusr + 0.27 csys = 2.24 CPU)
Failed 13/15 test programs. 240/253 subtests failed.
make: *** [test] Error 255
rorot at rorot-laptop:~/.cpan/build/Mozilla-Mechanize-0.05$
------------------------------------------------------------------------------------------------
另: 这里有一个返回引用的问题,我一直疑惑,请教诸位。
在我的一个package里,我这么写道:
sub new {
my $class = shift;
my $self = {@_};
bless ($self, $class);
$self->_init;
return $self;
}
sub _init {
my $self = shift;
#return if (exists %$self{'dbh'});
$self->{'dbh'} = DBI->connect($DBD, $username, $password) || die
"Connect Database Error";
$self->{'dbh'}->{unicode} = 0;
}
sub DESTROY {
my $self = shift;
$self->{'dbh'}->disconnect if $self->{'dbh'};
}
sub dbh {
my $self = shift;
return $self->{'dbh'};
}
-------------------------------------------------------------------------------------------------
其中的dbh()方法,是我为了在别的方法里调用方便时写的。比如在该pakeage的其他方法里,我可以这么调用dbh:
$self->dbh->query($query);
但问题是,我不知道在sub dbh()方法里return $self->{'dbh'},
是不是又临时拷贝了一份dbh对象,还是直接返回了dbh对象的引用(不是指针). 我这样写的dbh()方法,是否有多生成临时对象的嫌疑?
或者为了方便在别的函数里使用$self->dbh->method的形式,而又更好的撰写dbh()函数的途径?(
主要是为了避免临时对象的生成,不知道在perl里面是如何处理的?)
实质上,我对perl对象的引用和指针一直混淆不清。有诸位解释一下吗?期待回复。
rorot
在07-11-26,jzhang <jzhang533 at gmail.com> 写道:
>
> > 谢谢Qiang的指点!
> >
> > HTML::DOM,
> >
> HTML::TreeBuilder我都测试过,在我看来,这些模块侧重于建立一个DOM模型,而不侧重解析一个HTML的(标准或者不标准的)文档。诸位看法?
>
>
> HTML::DOM我没用过,但是HTML::TreeBuilder就是用来解析HTML的,对于不标准的HTML文档应该也没问题。你可以看看HTML::Element的文档,那里说的更详细。
>
> >
> >
> 在顺利安装完Mozilla::DOM后,着手编写脚本时,却始终无法找到此模块(Mozilla::DOM)的初始化程序,即New方法。于是进一步google,
> > 才发现需要Mozilla::Mechanize来作init的工作。进而安装Mozilla::Mechanize, make test
> 成功率只有5%,
> > 无法正常安装。于是转而求助于WWW::Mechanize. 终于发现,WWW::Mechanize才是最适合我需要的东西。其优势有二:
> >
> > 1, 成功解析HTML文档,能正确找到各种HTML Elements.
> > 2, 不需要GTK支持。可以运行在Console模式。
>
> Mech的主要功能应该是模拟POST,GET以及点击链接等操作的吧。
> 有本叫Spidering Hacks的书里面讲的更详细,讲了关于网络爬虫和网页解析的很多模块,写的很不错。网上应该有电子版的。
>
> >
> > 但也有不足之处。至少WWW::Mechanize缺少了DOM里的Event支持。而Mozilla::DOM则完美的支持DOM里的一切。
> >
> >
> 虽然Mozilla::Mechanize的运行,需要GTK2的支持,但是因为其对DOM的完美支持,我还是倾向于最终使用此模块。但问题是,为什么我的Mozilla::Mechanize编译都成功,而make
> > test却无法通过? 尽管在configure的时候,并没有发现缺少哪个模块。
> >
> > Qiang推荐的WEB::Scraper我等于会去看一下。谢谢你的回复!
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.pm.org/pipermail/china-pm/attachments/20071126/5560576c/attachment-0001.html
More information about the China-pm
mailing list