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 処理で例を示しました。私はこの新しい (っぽい) Web クライアントの機能を本当に楽しんでいます。必要なものはほとんどすべてそろっており (追加のモジュールはありません)、非常にうまく統合されています。

于 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 に答える