2012-04-09 4 views
0

MSDN is a huge hierarchical doc site.再帰Webダウンロード以下のリンクは、DOMの基準に従って

は、より正確には、コンテンツを階層的に組織化が、URLはありませんされています。 URLスペースはフラットなので、すべてが同じディレクトリにあるように見えます。 (実際には、ディレクトリが存在しない可能性がありますが、他のデータベースからものが出てきていると思いますが、ここでは関係ありません)

MSDNの一部をダウンロードする場合は、NMake manual指定されたディレクトリの下のすべてを再帰的にダウンロードすることはできません。それはMSDNのすべてになるからです。あなたのハードドライブと帯域幅には多すぎます。

しかし、あなたはその後、CSS class属性toc_childrentoc_siblingsではなくtoc_parentのものと同様に、文書の特定のナビゲーションセクションに含まれているだけで、これらのリンクをたどると、ダウンロードするにはDOM(HTML)を見て、スクリプトを書くことができます。

何が必要だろうが、あなたが言うことができますいくつかのダウンローダのようになります。

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

Perlの、LWPとXMLを使用して、一緒に何かを考え出すにはあまりにも難しいことではありません::のlibxml(HTMLパーサ)しかし、おそらくあなたはそれを再現する必要はないので、あなたはそれを行うことを可能にするツールを知っているかもしれません。

Perlである必要はありません。他の言語でも問題ありません。このジョブに必要な柔軟性を備えた既製のプログラムもあります。

+1

あなたは質問をするのを忘れてしまったようです。 – ikegami

+1

@ikegami - 正確か、密なのか?私は「たぶん、そうすることができるツールを知っているかもしれない」と書いていますが、私は疑問符を忘れてしまったことは認めています。 – Lumi

+0

いいえ、非常に正確なカスタム要件に一致する既存のツールはありません。しかし、ええ、私は密集しています。私はあなたの利益のために私が聞いた唯一の質問(私のコードを書くことができますか?)を意図的に無視しています。 – ikegami

答えて

2

WWW::Mechanizeからfind_link関数(および兄弟)を確認してください。任意の基準を使用して、 "id"および "class"属性を含むリンクを見つけることができます。

+0

これはXPathやCSSセレクタを使用していないことを認識していますが、仕事を完了するためにそれらを必要としないかもしれません。 – benrifkah

+0

ありがとう、 'WWW :: Mechanize'は私が最初に見たものでした。残念ながら、そのリンク仕様はDOM内のリンクの位置を考慮しません。リンクタグだけを見て、タグ内のタグの場所に関する情報はありません。 [HTML :: Parser](https://metacpan.org/module/HTML::Parser)を使用します。これはDOMを構築しないので、必要な情報はありません。とにかくありがとう。 – Lumi

+0

私はそれを考えましたが、リンク検索をDOMのサブセットに制限するのに必要なHTMLのサンプルがないと、100%明確ではありませんでした。 [Script Adam Gotch made](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::TreeBuilder::XPath) – benrifkah

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 }; 
} 
2

Mojo::UserAgentは、CSS3セレクタまたはXPathを理解するものを返します。たとえば、Painless RSS processing with Mojoに例を示しただけです。私は本当にこの新しい(ish)Webクライアントのものを楽しんでいます。私が望むほとんどのものはすでにそこにあります(追加のモジュールはありません)。

+0

おかげさまで、「Mojo :: UserAgent」をスタンドアロンの方法で使用することは考えていませんでした。しかし、はい、どうしてですか? – Lumi

関連する問題