- ベストアンサー
ブログのHTMLからトラックバックをしたブログのURLの抽出
ブログのHTMLから、そのブログのある記事に トラックバックをしたブログのURLを抽出するプログラムを作りたいと思います。 例えば、URLがhttp://blogs.yahoo.co.jp/example/1234というヤフーのブログの記事に、 http://blog.goo.ne.jp/example/1234 http://blogs.yahoo.co.jp/example2.html の二つのブログがトラックバックをしたとします。 このヤフーのブログの記事のHTMLは以下のようになります。 <html> <head> … <style="display:none">http://blogs.yahoo.co.jp/example/1234/trackback</div> … <tr id="tb_tab" style="display:block"> … <b><a href="http://blog.goo.ne.jp/example/1234" target=_blank>…</a></b> … <b><a href="http://blogs.yahoo.co.jp/example2.html" target=_blank>…</a></b> … </body> </html> そこで、トラックバックをしたURLを抽出するときに、 例えば、http://blog.goo.ne.jp/example/1234を抽出するのに、 target=_blankを参照して、 HTML中の<a href="http://blog.goo.ne.jp/example/1234" target=_blank>から http://blog.goo.ne.jp/example/1234を抜き出すようにして、 トラックバック先のURLを抽出するプログラムを作成したいです。 このようなプログラムを作成するにはどのようにプログラムを組めばいいのでしょうか? また、HTML中には、target=_blankで参照すると、以下のような <a href="http://rd.yahoo.co.jp/rss/b/blog/myblog/rss2/01/*http://blogs.yahoo.co.jp/example/rss.xml" target=_blank> [<a href="/example2/5242000" target=_blank> 余分な情報も抜き出してしまうので、上記を抽出しないように、 rssを含むもの、http:で始まらないものは抽出しないという条件で抽出できるようなら、 こちらの方法も教えていただきたいです。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
import java.io.*; import java.net.*; import java.util.regex.*; class GetTBAddrYAHOO { //トラックバックされているアドレスを抜き出す public static String[] getTBaddrYAHOO(String urlString){ String addr=""; boolean flag=false; try{ URL url = new URL(urlString); InputStream input = url.openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String aLine; Pattern trackBack = Pattern.compile("<a href=\"(http://.+)\" target=_blank>"); while((aLine = reader.readLine())!=null){ // if(aLine.indexOf("tb_tab")>=0){ if(aLine.indexOf("<tr id=\"tb_tab\" style=\"display:block\">") >=0){ flag=true;//ここからマッチングテスト開始 } else { if(flag && aLine.indexOf("<td class=\"sub_bg\">")>=0) break;//上記が表れたら、該当エリア終わり、処理止め } if(flag==false) continue;//該当エリアまで、読み飛ばし Matcher m = trackBack.matcher(aLine); if(m.find()){ addr+=m.group(1)+","; } } reader.close(); input.close(); } catch(MalformedURLException e){ e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } return addr.split(","); } public static void main(String[] args){ String[] TBaddr = getTBaddrYAHOO("http://blogs.yahoo.co.jp/****/13882500.html"); for(int i=0;i<TBaddr.length;i++) System.out.println(TBaddr[i]); TBaddr = getTBaddrYAHOO("http://blogs.yahoo.co.jp/****/archive/2005/10/19"); for(String addr : TBaddr) System.out.println(addr); } }
その他の回答 (3)
- omni2
- ベストアンサー率53% (33/62)
正規表現は詳しくないので、他の方にお譲りします。 まずは、参考までに下記を・・ http://java.sun.com/developer/technicalArticles/releases/1.4regex/ http://www.atmarkit.co.jp/fjava/javatips/108java016.html http://homepage2.nifty.com/tokushima/java/core/regex/BasicRegrexExample.html http://www.hellohiro.com/regex.htm http://634.ayumu-baby.com/javawork/re2.html http://www.moriwaki.net/wiki/index.php?[[%C0%B5%B5%AC%C9%BD%B8%BD]] ざっとこんなところが参考になるでしょうか? リンク抽出とかで検索すればもっとでてくるかもしれません。 また、Perl等の正規表現もおなじような感じなので、そちらを参考にされてもいいとおもいます。
お礼
ご回答ありがとうございます。 私も正規表現は、まだまだ勉強不足なので、 とても参考になります。 ありがとうございました。
- omni2
- ベストアンサー率53% (33/62)
javascriptや独自タグが入っているときは動作するかどうか未確認ですが、(多分おもったように抽出できないのではと・・) http://blog.goo.ne.jp/example/1234 から<A>タグのHREFからURLを抽出するばあいですが、 URLクラスのインスタンス作成。 URL url = new URL("http://blog.goo.ne.jp/example/1234 "); InputStreamReader クラスのインスタンスを作成。 InputStreamReader in = new InputStreamReader(url.openStream()); javax.swing.text.html.parser.ParserDelegator クラスのインスタンスを作成。 parseメソッドを使用。 APIを参照してください。 Readerには先ほど作成したinを指定してやればいいです。 booleanにはtrueを指定してやればいいのかな?? HTMLEditorKit.ParserCallbackはHTMLEditorKit.ParserCallbackクラスをextendsした 無名クラスを作成してやって、つまり、 new HTMLEditorKit.ParserCallback(){}と記述してやります。 handleStartTagメソッドの中に、 HTML.Tag tがHTML.Tag.Aの場合、 MutableAttributeSet aから、 a.getAttribute(HTML.Attribute.HREF); してやるという記述をすれば、HREFからURLが抽出できるのではないかと・・ ただ、冒頭にも書きましたが、独自タグや、 Javascriptが入った場合などはうまく動作してくれないとおもいますので、この方法でやるとかえって遠回りになります。 正規表現などで抽出するのがいいかもしれません。
お礼
ご回答ありがとうございます。 ヤフーだけでなく他のブログにても試してみたいのですが、 ブログのHTMLが各ブログごとで違うので、 javascriptや独自タグが入っていることが考えれれます。 ご回答にもありましたように、正規表現を使った方がいいかもしれません。 正規表現を使う場合はどのようにプログラムを書けばよろしいでしょうか? よろしくお願いします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
target=_blankがある<a~>というだけでは、本文中のリンクが該当してしまうので、うまくないと思います。 <tr id="tb_tab" style="display:block"> 以降で検索するとか ライブドアで言えば <a class="atrackback-post"であるリンクとか もう少し条件を限定できるようにした方がいいかと思います。
お礼
ご回答ありがとうございます。 いつもお世話になっております。 ご指摘されたように、ヤフーの場合は、 <tr id="tb_tab" style="display:block">以降にtarget=_blankで検索すると、 本文リンクを含まず、トラックバック先のURLを取得できそうです。 途中、[<a href="/example_jp" target=_blank></a>] のような、独自タグというかトラックバックをしたブログのホームのURL? を示すものがあるのですが、これはhttpを含まないという条件で、 抜き出さないようにすることができるのでしょうか? お手数ですが、よろしければ、 <tr id="tb_tab" style="display:block">以降にtarget=_blankで検索し、 ヤフーブログからトラックバック先のURLを取得する サンプルコードを紹介していただけないでしょうか? よろしくお願いします。
補足
ちなみに、トラックバック先のURLを取得する方法に、 トラックバックPing URL にクエリパラメータ __mode=rss を付加することによって、 RSS データをレスポンスとしてTrackbackURLの一覧を出力することができまして、 ライブドアやヤプログ・ココログなど、 全体のブログサービスの約4割のブログに対して、 この方法でトラックバック先のURLを取得できることを確認しました。 ですが、ヤフーや楽天などの残りの6割のブログでは__mode=rssに対応していないため、 今回質問したようにHTMLからの取得を試みています。 多くのブログが今回質問した方法を基に、問題点を解決するように、 各ブログのHTMLの構造に対応するように上手くプログラムを組めば、 トラックバック先のURLを取得することができるのではと考えています。
お礼
ご回答ありがとうございます。 無事トラックバック先のURLを取得できました。 ありがとうございました。