あるWebページ内にある全ての「リンク先のURLと文字列」を上手く取得する方法を探しています。


HTMLで言うと、例えば
<a href="http://q.hatena.ne.jp/">はてな</a>
ならば、
http://q.hatena.ne.jp/

「はてな」
を取得してくれると嬉しいです。

WebページのURLを入力したら、該当ページ内にある全ての「リンク先のURLと文字列」をドーッっと取得してくれるのが理想です。調べたいWebページは数百あるので、できるだけ力作業にならないようにしたいです。

フリーソフトやプログラムでも構いませんが、上記が叶う「使いやすい!」という方法等ありましたら、どうぞよろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/04/23 17:15:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:a-kuma3 No.1

回答回数4971ベストアンサー獲得回数2153

ポイント20pt

Ruby で書いてみました。

require 'net/http'
require 'uri'

Net::HTTP.version_1_1


#RE_A = %r|<a\s[^>]+href="([^"]+)"[^>]*>([^<]+)</a>|i        TransFreeBSD さんの突っ込みを受けて
RE_A = %r|<a\s[^>]*href="([^"]+)"[^>]*>(.+?)</a>|i


def extract_anchor(url)

    response = http_get(url,10)
    body = response.body
    index = 0
    last = body.length - 1
    while (p = (RE_A =~ body[index, last]))
        puts "#{$1} --> #{$2}"
        index += p + $1.length + $2.length
    end

end

$http_clazz = Net::HTTP

def http_get( uri_str, limit = 10 )
    raise ArgumentError, 'http redirect too deep' if limit == 0

    uri = URI.parse(uri_str)
    response = nil

    target = $http_clazz.new(uri.host, uri.port)
    target.read_timeout = 600
    target.start { |http|
        if uri.query.nil? then
            response, = http.get(uri.path)
        else
            response, = http.get(uri.path + '?' + uri.query)
        end
    }
    return response
end


target_url = "http://q.hatena.ne.jp/1334564001"

extract_anchor(target_url)


抽出対象のページを、この質問の URL にしてみました。
結果は、こちら。

https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> ユーザー登録
https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> ログイン
/help --> ヘルプ
/ --> トップ
/list --> 質問一覧
/ranking --> 注目の質問
/c/korenani --> コレナニ?
/enter --> 質問する
/enter?type=enquete --> アンケートする
/ --> 人力検索はてな
http://q.hatena.ne.jp/"> --> http://q.hatena.ne.jp/">
http://q.hatena.ne.jp/ --> http://q.hatena.ne.jp/
#c236156 --> 2012/04/16 19:13:08
https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> すでに登録されている方はこちらからログイン


最後の

target_url = "http://q.hatena.ne.jp/1334564001"
extract_anchor(target_url)

の部分を、

while gets
   extract_anchor($_.chomp)
end

とすると、URL の一覧を別ファイルに持っておいて、それを順次処理するようにできます。


言語は何でも良いと思いますが、何か一つ覚えておくと、こういうときに便利です。

もし、Ruby 以外をお望みなら「○○のコードが欲しいー」と、大きい声で叫ぶと、あんな人や、こんな人(どんな人?)が、コードを書いてくれそうな気がします。
とりあえず、Perl や PHP だったら、もう試している人がいるような気がします。


【追記】
TransFreeBSD さんから、いろいろ穴ぼこを指摘された(感謝)ので、その部分を直すと、こんな感じになりました。タグなどのサニタイズは省略してますが。

/ --> <img class="service-logo" src="/images/logo_question.png?new" alt="人力検索はてな" title="人力検索はてな">
https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> ユーザー登録
https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> ログイン
/help --> ヘルプ
http://www.hatena.ne.jp/ --> <img src="http://cdn.www.st-hatena.com/images/header/global-logo.png" alt="Hatena">
/ --> トップ
/list --> 質問一覧
/ranking --> 注目の質問
/c/korenani --> コレナニ?
/enter --> 質問する
/enter?type=enquete --> アンケートする
/ --> 人力検索はてな
/c/computer --> コンピュータ
/miku1973/ --> <img src="http://www.st-hatena.com/users/mi/miku1973/profile_l.gif" width="32" height="32" title="id:miku1973" alt="id:miku1973" class="hatena-id-image">
/miku1973/ --> miku1973
/miku1973/ --> もっと見る
/1334564001 --> <img src="/images/icon-jinriki-s.gif" alt="" title="" class="question-type">
/c/computer --> コンピュータ
/c/internet --> インターネット
http://q.hatena.ne.jp/"> --> http://q.hatena.ne.jp/">
http://q.hatena.ne.jp/ --> http://q.hatena.ne.jp/
https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> <img src="/images/button-login-hatena.gif" alt="はてなIDでログイン" title="はてなIDでログイン">
${url} --> <img src="${image_url}" alt="${alt}" data-urlname="${urlname}" class="hatena-id-image">{{if exuser}}<img src="/images/q/border-${exservice}.gif" class="badge-service">{{/if}}<img src="${emoticon_url}" alt="${emoticon_alt}" class="emoticonicon">
/a-kuma3/ --> <img src="http://www.st-hatena.com/users/a-/a-kuma3/profile_l.gif" width="32" height="32" title="id:a-kuma3" alt="id:a-kuma3" class="hatena-id-image">
/a-kuma3/ --> a-kuma3
/1334564001#a1142689 --> 2012/04/16 21:32:39
https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001
https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001
http://q.hatena.ne.jp/"> --> http://q.hatena.ne.jp/">
http://q.hatena.ne.jp/"> --> http://q.hatena.ne.jp/">
http://q.hatena.ne.jp/ --> http://q.hatena.ne.jp/
http://q.hatena.ne.jp/ --> http://q.hatena.ne.jp/
https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001
/maya70828/ --> <img src="http://www.st-hatena.com/users/ma/maya70828/profile_l.gif" width="32" height="32" title="id:maya70828" alt="id:maya70828" class="hatena-id-image">
/maya70828/ --> 楽1978
/1334564001#a1142690 --> 2012/04/16 21:36:21
http://www.forest.impress.co.jp/article/2005/06/17/ablink.html --> http://www.forest.impress.co.jp/article/2005/06/17/ablink.html
http://www.vector.co.jp/soft/dl/win95/net/se261717.html --> http://www.vector.co.jp/soft/dl/win95/net/se261717.html
http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-install-virtualbox-and-use-windows-software-in-mac.html --> http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-install-virtualbox-and-use-windows-software-in-mac.html
https://www.virtualbox.org/wiki/Downloads --> https://www.virtualbox.org/wiki/Downloads
http://wayohoo.com/mac/apps/utilities/mikuinstaller.html --> http://wayohoo.com/mac/apps/utilities/mikuinstaller.html
/language_and_engineering/ --> <img src="http://www.st-hatena.com/users/la/language_and_engineering/profile_l.gif" width="32" height="32" title="id:language_and_engineering" alt="id:language_and_engineering" class="hatena-id-image">
/language_and_engineering/ --> lang_and_engine
/1334564001#a1142745 --> 2012/04/17 10:41:36
/TransFreeBSD/ --> <img src="http://www.st-hatena.com/users/Tr/TransFreeBSD/profile_l.gif" width="32" height="32" title="id:TransFreeBSD" alt="id:TransFreeBSD" class="hatena-id-image">
/TransFreeBSD/ --> <img src="http://www.st-hatena.com/users/Tr/TransFreeBSD/profile_s.gif" width="16" height="16"  alt="" class="hatena-id-icon">TransFreeBSD
#c236156 --> 2012/04/16 19:13:08
http://twitter.com/#!/${screen_name}/status/${id} --> <img src="${profile_image_url}" class="profile-image" width="32" height="32">
http://twitter.com/#!/${screen_name}/status/${id} --> @${screen_name}
/help/answer_request --> 制限について
#ar-tabs-3 --> ともだちから選択
#ar-tabs-4 --> リクエスト送信済
http://rikunabi-next.yahoo.co.jp/ --> 転職ならリクナビNEXT
http://b.hatena.ne.jp/entry/http://q.hatena.ne.jp/1334564001 --> <img src="http://b.st-hatena.com/images/entry-button/button-only.gif" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" />
http://twitter.com/share --> ツイートする
/TransFreeBSD/watchlist --> <img src="http://www.st-hatena.com/users/Tr/TransFreeBSD/profile.gif" width="24" height="24" title="id:TransFreeBSD" alt="id:TransFreeBSD" class="hatena-id-image">
/a-kuma3/watchlist --> <img src="http://www.st-hatena.com/users/a-/a-kuma3/profile.gif" width="24" height="24" title="id:a-kuma3" alt="id:a-kuma3" class="hatena-id-image">
/keyword/%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BD%E3%83%95%E3%83%88 --> <span class="list-tag-word" data-score="47">フリーソフト</span><span class="related-count">1732</span>
/keyword/%E3%81%AF%E3%81%A6%E3%81%AA --> <span class="list-tag-word" data-score="43">はてな</span><span class="related-count">4842</span>
/keyword/HTML --> <span class="list-tag-word" data-score="34">HTML</span><span class="related-count">3994</span>
/keyword/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0 --> <span class="list-tag-word" data-score="23">プログラム</span><span class="related-count">4106</span>
/keyword/URL --> <span class="list-tag-word" data-score="23">URL</span><span class="related-count">9396</span>
/keyword/%E6%96%87%E5%AD%97%E5%88%97 --> <span class="list-tag-word" data-score="23">文字列</span><span class="related-count">1672</span>
https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001&via=200101 --> <img src="/images/button-register.gif" alt="いますぐ利用登録!無料" />
https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001 --> すでに登録されている方はこちらからログイン
/1237778469 --> <span class="question-content">★採用回答には 300 ~ 800 pt★ 以下に示す「ユーザーの動作」を私が行った場合に、「プログラム/スクリプトの動作」を自動で行ってくれる方法を教えて下さい…</span>
/Nigitama/ --> にぎたま
/1323393541 --> <span class="question-content">A8の楽天市場のアフィリエイトがリニューアルされてA8の管理画面からリンクを作るようになりましたが、以前のように商品の検索結果をアフィリエイトのリンクに…</span>
/ringomaru/ --> ringomaru
/1323393541#a1122008 --> <img src="/images/badge-bestanswer-s.gif" alt="ベストアンサーあり">
/1164276573 --> <span class="question-content">IISのASP(VBScript)でWiki記法のパーサーのようなものを実装したいとおもっています。…</span>
/youichirou/ --> よーいち
/1200474454 --> <span class="question-content">フリーソフトを探しています。自分で作る場合のヒントでも結構ですので情報をお願いします。…</span>
/freewriter/ --> にらたま
/1155130885 --> <span class="question-content">SSL、CGI を使ったサイトの質問です。 https://www.example.jp/form.html にアクセスしたときの form.html に張られている相対リンク(例えば、./help.html) をク…</span>
/ishideo/ --> ishideo
/1328175221 --> <span class="question-content">Ubuntu11.04でGVIMを利用していますが、 コマンドモード時に日本語入力ができなくて困っています。…</span>
/hardboiled243/ --> hardboiled243
/1328926452 --> <span class="question-content">WEB上でテキストを入力すると、その内容に応じて情報を表示するシステムの作成方法について 以下のようなサイト内のシステムをどのように作ったらよいのか 質問…</span>
/lilmo345/ --> lilmo345
/1328926452#a1132033 --> <img src="/images/badge-bestanswer-s.gif" alt="ベストアンサーあり">
${url} --> <img src="${image_url}">
${url} --> ${title}
http://b.hatena.ne.jp/entry/${url} --> <img src="http://b.hatena.ne.jp/entry/image/${url}">

先の回答は、自戒の意味を込めて、元の形が残るように修正しました。

他1件のコメントを見る
id:a-kuma3

なはは、穴だらけ :-)

2012/04/17 11:51:11
id:Cherenkov

つNokogiri

2012/04/17 21:28:12
id:maya70828 No.2

回答回数1364ベストアンサー獲得回数139

ポイント20pt

>WebページのURLを入力したら~
理想のソフトではありませんが、リンク先のURLと文字列を取得するソフトがあります。
AB-Link説明(ページ内にあるリンクは切れています)
http://www.forest.impress.co.jp/article/2005/06/17/ablink.html
AB-Linkダウンロード
http://www.vector.co.jp/soft/dl/win95/net/se261717.html

*Macでは使えないのと別途VB6.0ランタイムが必要です。

もしMacでどうしても使うのであれば
MacとWindowsを同時使用できる無料の仮想化ソフト「VirtualBox」の使い方
http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-install-virtualbox-and-use-windows-software-in-mac.html
「VirtualBox」ダウンロード
https://www.virtualbox.org/wiki/Downloads
Mac上でWindowsのソフトが動いてしまうフリーソフト「MikuInstaller」の使い方
http://wayohoo.com/mac/apps/utilities/mikuinstaller.html

も検討してみるのもいいかもしれません。(VB6.0ランタイムがちゃんと動くかどうかは不明)

id:language_and_engineering No.3

回答回数170ベストアンサー獲得回数63

ポイント20pt

ブックマークレットとして,1行で実装しました。

IEで該当ページを開き,ブラウザのURLバーに下記の文字列をコピペして,Enterを押してください。


javascript:(function(){var d=window.document;var as=d.getElementsByTagName("a");var s="";var v=d.createElement("div");for(var i=0,len=as.length;i<len;i++){s+=i+", "+as[i].href+", "+as[i].innerText+"<br>";}v.innerHTML=s;d.body.appendChild(v);alert("完了");})();void(0);


サンプルとして,このページで実行すると,画面の末尾に下記のように結果が一瞬で出力されます。


0, http://q.hatena.ne.jp/, 
1, https://www.hatena.ne.jp/register?location=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001, ユーザー登録
2, https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fq.hatena.ne.jp%2F1334564001, ログイン
3, http://q.hatena.ne.jp/help, ヘルプ
4, http://www.hatena.ne.jp/, 
5, http://q.hatena.ne.jp/, トップ
6, http://q.hatena.ne.jp/list, 質問一覧
7, http://q.hatena.ne.jp/ranking, 注目の質問
8, http://q.hatena.ne.jp/c/korenani, コレナニ?
9, http://q.hatena.ne.jp/enter, 質問する
10, http://q.hatena.ne.jp/enter?type=enquete, アンケートする

・・・

109, http://www.amazon.co.jp/exec/obidos/ASIN/B007BRSJP8/hatena-q-22/ref=nosim, ハテナ/夢みたいだ
110, http://b.hatena.ne.jp/entry/http://www.amazon.co.jp/exec/obidos/ASIN/B007BRSJP8/hatena-q-22/ref=nosim, 
111, http://www.amazon.co.jp/exec/obidos/ASIN/4798126179/hatena-q-22/ref=nosim, 
112, http://www.amazon.co.jp/exec/obidos/ASIN/4798126179/hatena-q-22/ref=nosim, HTML5の絵本
113, http://b.hatena.ne.jp/entry/http://www.amazon.co.jp/exec/obidos/ASIN/4798126179/hatena-q-22/ref=nosim, 
114, http://www.amazon.co.jp/exec/obidos/ASIN/4822283151/hatena-q-22/ref=nosim, 
115, http://www.amazon.co.jp/exec/obidos/ASIN/4822283151/hatena-q-22/ref=nosim, プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識
116, http://b.hatena.ne.jp/entry/http://www.amazon.co.jp/exec/obidos/ASIN/4822283151/hatena-q-22/ref=nosim, 
117, http://www.amazon.co.jp/exec/obidos/ASIN/4789818446/hatena-q-22/ref=nosim, 
118, http://www.amazon.co.jp/exec/obidos/ASIN/4789818446/hatena-q-22/ref=nosim, PerlによるWebユーザビリティ向上テクニック―ユーザ追跡/対ロボット/ログ解析;エラー回避/検索/URL転送/文字コード/パフォーマンス/セキュリティ (Web Proシリーズ)
119, http://b.hatena.ne.jp/entry/http://www.amazon.co.jp/exec/obidos/ASIN/4789818446/hatena-q-22/ref=nosim, 

id:miku1973

ありがとうございます!
いちばん簡単そうだったlang_and_engineさんのをやってみましたが、凄すぎです。感動しました。使わさせていただきますね!お礼まで。

2012/04/18 06:45:12
id:language_and_engineering

エエー いいのでしょうか。

ページが数百あると各ページでの手動作業になってしまいます。


でも1ページ分の抽出は一瞬で,ブラウザさえあれば実行できるので,使いやすいのは確かです。

複数人で手分け等すれば,この方法は堅実かもしれません。


もし,これ系の要望を自作プログラムで実現したい場合,必要になるキーワードを下記に記しておきます。

今後の質問等にお役立て下さい。

・Webスクレイピング。

・DOM構造のパース。(正規表現による文字列解析は,泥沼にはまるのでNG)

・ブラウザの自動操作。

・HTTPクローラ。

時間さえあれば,複数ページでも一発で手軽に実行できるようなバッチを書きたい所なんですがね。

2012/04/18 07:20:35
id:a-kuma3 No.4

回答回数4971ベストアンサー獲得回数2153

ポイント20pt

つNokogiri

id:Cherenkov さんから、Nokogiri(という XML/HTML を解釈してくれるライブラリ)を使えばええやん、という突っ込みを受けたので、別のソースを書きました。
言いなりだと芸が無いので、Mechanize というライブラリを使ってみました(Mechanize は Nokogiri を使ってます)。

require 'mechanize'

agent = Mechanize.new
agent.get('http://q.hatena.ne.jp/1334564001')
agent.page.links.each { |link|
    puts "#{link.href} --> #{link.text}"
}

# うぉ、短い

使ったことが無いライブラリだったので、サンプルコードのお世話になりました。
http://mechanize.rubyforge.org/EXAMPLES_rdoc.html
http://d.hatena.ne.jp/kitamomonga/touch/searchdiary?word=*[Mechanize]&of=15
http://w.livedoor.jp/ruby_mechanize/d/Mechanize%3a%3aPage
http://w.livedoor.jp/ruby_mechanize/d/Mechanize%3a%3aPage%3a%3aLink

id:Cherenkov No.5

回答回数1504ベストアンサー獲得回数493

ポイント20pt

回答4を発展させてみました。
https://gist.github.com/2410393

ruby get_anchor.rb url_list.txt

のようにURLが一行ずつ書いてあるテキストファイルを読み込むと、outputフォルダに各URLの結果のテキストファイルを作成します。

ruby導入手順

でいけると思います。

  • id:TransFreeBSD
    環境はwindowsでしょうか?プログラムは何が使えるのでしょうか?
    macやlinuxは使えますか?
    perl/python/rubyあたりが使えると楽そうな気がします。
    macならautomatorでもいけるかもしれません。
    vba+ieでも出来ると思いますが、数が多いのでエラー処理とか安定性とか速度とか、若干不安です。
    専用ツールがあれば一番楽でしょうけれど。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません