[PerlChina] perl解析HTML处理成DOM对象的处理

jzhang jzhang533 at gmail.com
Mon Nov 26 18:15:08 PST 2007


On Nov 26, 2007 11:55 PM, rorot <yang.liana at gmail.com> wrote:
> 谢谢诸位, 特别是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对象的引用和指针一直混淆不清。有诸位解释一下吗?期待回复。

还是引用啊,因为connect返回的是一个perl 的object,实际上就是一个bless过的hash的引用,所以这里返回去的还是引用。
可以试试看Class::DBI模块,比你这样硬写DBI的connect, prepare, execute方便很多。



>
> 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我等于会去看一下。谢谢你的回复!
> > >
> >
>
> _______________________________________________
> China-pm mailing list
> China-pm at pm.org
> http://mail.pm.org/mailman/listinfo/china-pm
>


More information about the China-pm mailing list