【发布时间】:2011-08-29 06:34:21
【问题描述】:
我目前正在使用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 变量告诉 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 路径。
【问题讨论】:
标签: perl parsing dom mechanize relative-path