根据DOM标准下载链接的递归Web下载

MSDN是一个庞大的分层文档站点。

更准确地说,内容是以分层方式组织的,但URL不是。 URL空间是平的,使得它看起来像是在同一目录中。 (实际上,可能没有目录;我想事情是从其他数据库出来的;但这在这里并不重要。)

因此,如果你想下载部分MSDN,比如说NMake手册 ,你不能只是递归地下载给定目录下的所有内容。 因为那将是MSDN的全部。 你的硬盘和带宽太多了。

但是你可以编写一个查看DOM(HTML)的脚本,然后只跟踪并下载文档某些导航部分中包含的那些链接,比如CSS class属性toc_childrentoc_siblings ,但不包括toc_parent

你需要的是一些允许你说的下载器:

 $webclient->add_links( $xpath_expression ); # or $webclient->add_links( $css_selector ); 

使用Perl,LWP和XML :: LibXML(HTML解析器)拼凑一些东西应该不会太难,但也许你知道一个允许你这样做的工具,所以我不需要重新发明它。

它不一定是Perl,任何其他语言都可以,也是一个现成的程序,具有这项工作所需的灵活性。

查看来自WWW :: Mechanize的find_link函数(和兄弟姐妹)。 它可以使用任意标准来查找包含“id”和“class”属性的链接。

Mojo :: UserAgent返回了解CSS3选择器或XPath的东西。 例如,我刚刚在Mojo的无痛RSS处理中展示了一个例子。 我真的很享受这个新的(ish)网络客户端的东西。 我想要的大多数东西都已经存在(没有额外的模块),它集成得非常好。

这可能会让你开始朝着正确的方向前进或引导你误入歧途。 请注意,我首先将页面保存到本地文件,以免在我工作时不断下载。

 #!/usr/bin/env perl use strict; use warnings; use HTML::TreeBuilder::XPath; my $tree = HTML::TreeBuilder::XPath->new; $tree->parse_file('nmake-ref.html'); my @links = map { { $_->as_text => $_->attr('href') } } $tree->findnodes(q{//div[@class='sectionblock']/*/a}); for my $link (@links) { my ($entry, $url) = %{ $link }; ($link->{ file } = "$entry.html" ) =~ s/[^A-Za-z_0-9.]+/_/g; system wget => qq{'$url'}, '-O', $link->{ file }; }