递归web下载以下链接根据DOM标准

问题描述:

MSDN is a huge hierarchical doc site.递归web下载以下链接根据DOM标准

为了更加精确,内容以分层方式组织,但网址都没有。 URL空间是平坦的,使得它看起来像所有东西都在同一个目录中。 (实际上,可能没有一个目录;我想事情是从其他数据库中出来的;但这与此无关)。

所以如果你想下载MSDN的一部分,比如说NMake manual,那么你不能递归地下载给定目录下的所有内容。因为那将是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,任何其他语言都不错,而且现成的程序也具有这项工作所需的灵活性。

+1

你似乎忘记提问了。 – ikegami 2012-04-09 18:33:47

+1

@ikegami - 精确或密集,呃?我写了“也许你知道一个工具,可以让你做到这一点”,但我承认我忘了问号。 – Lumi 2012-04-09 19:10:49

+0

不,没有现成的工具可以满足您极其精确的自定义要求,而且您知道这一点。但是,我正在密集。我故意忽略了我听到的唯一问题(“你能为我写代码吗?”)为了你的利益。 – ikegami 2012-04-10 04:10:05

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

+0

我意识到这不使用XPath或CSS选择器,但您可能不需要它们来完成任务。 – benrifkah 2012-04-09 16:22:19

+0

谢谢,'WWW :: Mechanize'是我首先看到的。不幸的是,它的链接规范并没有考虑DOM中链接的位置;它只查看链接标记,并且没有关于标记在文档中的位置的任何信息。它使用[HTML :: Parser](https://metacpan.org/module/HTML::Parser),它不构建DOM,因此我需要的信息不在那里。不管怎么说,还是要谢谢你。 – Lumi 2012-04-09 17:08:24

+0

我认为,但是如果没有您需要将链接搜索限制为DOM子集的HTML示例,我并不清楚。查看[Adam Gotch制作的脚本](http://perlbuzz.com/2011/11/finding-a-lost-dogs-owner-with-perl-and-wwwmechanize.html),将WWW :: Mechanize与[ HTML :: TreeBuilder :: XPath](https://metacpan.org/module/HTML::TBuilderBuilder::XPath) – benrifkah 2012-04-09 17:31:45

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

#!/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 }; 
} 

Mojo::UserAgent回报的东西,理解CSS3选择器或XPath。例如,我刚刚在Painless RSS processing with Mojo中举了一个例子。我真的很享受这个新的(ish)网络客户端的东西。我想要的大多数东西都已经存在(没有额外的模块),并且它非常好地集成在一起。

+0

谢谢 - 没有想过以独立的方式使用'Mojo :: UserAgent'。但是,为什么不呢? – Lumi 2012-04-10 14:01:08