使用Perl-Mechanize进行Dom-Processing:完成一个小程序

时间:2011-05-19 22:54:12

标签: perl parsing dom mechanize relative-path

我正在使用this dataset of 2700 foundations开发一台小型收割机。所有数据均可免费使用,不受任何限制或版权保护。

到目前为止我所拥有的:如果我采用WWW :: Mechanize,收获任务应该没问题 - 特别是在进行基于表单的搜索和选择单个条目时。嗯 - 我猜这个算法基本上是两个嵌套循环:外循环运行基于表单的搜索,内循环处理搜索结果。

外部循环将使用页面上第二个搜索表单上的select()submit_form()函数。我们可以在这里使用DOM处理吗?那么 - 我们如何才能获得选择值。

结果的内部循环将使用跟随链接功能使用以下调用来获取实际条目。

$mech->follow_link(url_regex => qr/webgrab_path=http:\/\/evs2000.*\?
Id=\d+$/, n => $result_nbr);

这会将我们的机制浏览器转发到输入页面。基本上,URL查询会查找具有webgrap_path到Id模式的链接,这对于每个数据库条目都是唯一的。 $result_nbr变量告诉我下一步应该遵循哪一个结果。

如果我们有几个结果页面,我们也会使用相同的技巧遍历结果页面。对于条目信息的语义提取,我们可以使用XML解析实际条目的内容:LibXML的html解析器(在此页面上可以正常工作),因为它为您提供了一些强大的DOM选择(使用XPath)方法。 那么实际的页面循环应该可以在几行Perl中完成(最多20行 - 可能更少)。

但等等:条目页面的处理将是最复杂的部分 的脚本。

方法:原则上我们可以使用单个while循环执行相同的算法 如果我们巧妙地使用back()函数。

你可以给我一个开头的提示 - 输入页面的处理 - 在Perl :: Mechanize中这样做吗?

这就是我所拥有的:

 GetThePage(
    starting url 
);
sub GetThePage {
    my $mech ...
    my @pages = ...
    while(@pages) {
       my $page = shift @pages;
       $mech->get( $page );
       push @pages, GetMorePages( $mech );
       SomethingImportant( $mech );
       SomethingXPATH( $mech );
    }
}

问题是如何找到DOM路径。

2 个答案:

答案 0 :(得分:2)

使用Firebug,Opera Dragonfly,Chromium Developer工具。

Firebug screenshot

调用指定元素的上下文菜单,将XPath表达式或CSS选择器(对Web::Query有用)复制到剪贴板。

答案 1 :(得分:1)

你真的想用Web::Scraper来做这件事。