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