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

2024-05-14 21:39:14 发布

您现在位置:Python中文网/ 问答频道 /正文

MSDN is a huge hierarchical doc site.

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

因此,如果你想下载MSDN的一部分,比如NMake manual,你不能只递归地下载给定目录下的所有内容。因为这将是MSDN的全部。对你的硬盘和乐队来说太多了。在

但是,您可以编写一个查看DOM(HTML)的脚本,然后只下载包含在文档某些导航部分中的链接,比如CSS class属性{}和{},而不是{}。在

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

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

使用Perl、LWP和XML::LibXML(HTML解析器)拼凑起来应该不太困难,但也许您知道有一种工具可以让您这样做,所以我不需要重新设计它。在

它不必是Perl,任何其他语言都可以,一个现成的程序也可以,它具有执行此任务所需的灵活性。在


Tags: 目录add内容docis分层html方式
3条回答

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

Mojo::UserAgent返回理解CSS3选择器或XPath的内容。例如,我刚刚在Painless RSS processing with Mojo中展示了一个例子。我真的很喜欢这个新的(ish)web客户端的东西。大多数我想要的东西都已经在那里了(没有额外的模块),而且集成得很好。在

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

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

相关问题 更多 >

    热门问题