0

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

更准确地说,内容是以分层方式组织的,但 URL 不是。URL 空间是扁平的,看起来就像所有东西都在同一个目录中。(实际上,可能没有目录;我猜事情是从其他数据库中出来的;但这与这里无关。)

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

但是您可以编写一个查看 DOM (HTML) 的脚本,然后只跟踪和下载文档某些导航部分中包含的链接,例如 CSSclass属性toc_children和的链接toc_siblings,而不是toc_parent.

你需要的是一些下载器,它可以让你说:

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

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

它不必是 Perl,任何其他语言也可以,并且具有这项工作所需的灵活性的现成程序也是如此。

4

3 回答 3

2

查看WWW::Mechanize中的 find_link 函数(和同级函数) 。它可以使用任意标准来查找包括“id”和“class”属性的链接。

于 2012-04-09T16:17:55.843 回答
2

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

于 2012-04-10T00:01:09.333 回答
1

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

#!/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 };
}
于 2012-04-09T17:26:07.083 回答