[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