问题描述
|
我目前正在使用这个2700个基金会的数据集来开发一个小型收割机。所有数据均可免费使用,没有任何限制或版权问题。
到目前为止,我所拥有的:如果我采用WWW :: Mechanize,则收获任务应该没问题,尤其是进行基于表单的搜索并选择单个条目时。嗯,我想算法基本上是两个嵌套循环:外部循环运行基于表单的搜索,内部循环处理搜索结果。
外循环将在页面的第二个搜索表单上使用
select()
和submit_form()
函数。我们可以在这里使用DOM处理吗?好吧-我们如何获得选择值。
通过结果的内部循环将使用跟随链接功能通过以下调用到达实际条目。
$mech->follow_link(url_regex => qr/webgrab_path=http:\\/\\/evs2000.*\\?
Id=\\d+$/,n => $result_nbr);
这会将我们的技工浏览器转发到条目页面。基本上,URL查询会查找具有到id模式的webgrap_path的链接,该链接对于每个数据库条目都是唯一的。 $result_nbr
变量告诉mecha接下来应该跟随哪个结果。
如果我们有多个结果页面,我们还将使用相同的技巧来遍历结果页面。为了语义提取条目信息,我们可以使用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路径。
解决方法
使用Firebug,Opera Dragonfly,Chromium Developer工具。
调用指定元素上的上下文菜单,将XPath表达式或CSS选择器(对Web :: Query有用)复制到剪贴板。
,真的,您想对这种事情使用Web :: Scraper。