• ベストアンサー

ブログの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:で始まらないものは抽出しないという条件で抽出できるようなら、 こちらの方法も教えていただきたいです。 よろしくお願いします。

  • shows
  • お礼率96% (48/50)
  • Java
  • 回答数4
  • ありがとう数565

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.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); } }

shows
質問者

お礼

ご回答ありがとうございます。 無事トラックバック先のURLを取得できました。 ありがとうございました。

その他の回答 (3)

  • omni2
  • ベストアンサー率53% (33/62)
回答No.3

正規表現は詳しくないので、他の方にお譲りします。 まずは、参考までに下記を・・ 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等の正規表現もおなじような感じなので、そちらを参考にされてもいいとおもいます。

shows
質問者

お礼

ご回答ありがとうございます。 私も正規表現は、まだまだ勉強不足なので、 とても参考になります。 ありがとうございました。

  • omni2
  • ベストアンサー率53% (33/62)
回答No.2

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が入った場合などはうまく動作してくれないとおもいますので、この方法でやるとかえって遠回りになります。 正規表現などで抽出するのがいいかもしれません。

shows
質問者

お礼

ご回答ありがとうございます。 ヤフーだけでなく他のブログにても試してみたいのですが、 ブログのHTMLが各ブログごとで違うので、 javascriptや独自タグが入っていることが考えれれます。 ご回答にもありましたように、正規表現を使った方がいいかもしれません。 正規表現を使う場合はどのようにプログラムを書けばよろしいでしょうか? よろしくお願いします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

target=_blankがある<a~>というだけでは、本文中のリンクが該当してしまうので、うまくないと思います。 <tr id="tb_tab" style="display:block"> 以降で検索するとか ライブドアで言えば <a class="atrackback-post"であるリンクとか もう少し条件を限定できるようにした方がいいかと思います。

shows
質問者

お礼

ご回答ありがとうございます。 いつもお世話になっております。 ご指摘されたように、ヤフーの場合は、 <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を取得する サンプルコードを紹介していただけないでしょうか? よろしくお願いします。

shows
質問者

補足

ちなみに、トラックバック先のURLを取得する方法に、 トラックバックPing URL にクエリパラメータ __mode=rss を付加することによって、 RSS データをレスポンスとしてTrackbackURLの一覧を出力することができまして、 ライブドアやヤプログ・ココログなど、 全体のブログサービスの約4割のブログに対して、 この方法でトラックバック先のURLを取得できることを確認しました。 ですが、ヤフーや楽天などの残りの6割のブログでは__mode=rssに対応していないため、 今回質問したようにHTMLからの取得を試みています。 多くのブログが今回質問した方法を基に、問題点を解決するように、 各ブログのHTMLの構造に対応するように上手くプログラムを組めば、 トラックバック先のURLを取得することができるのではと考えています。

関連するQ&A

  • ブログのHTMLからトラックバックをしたブログのURLの抽出(URLの重複抽出を避けたい)

    いつもお世話になっています。 先日、「ブログのHTMLからトラックバックをしたブログのURLの抽出」 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1725502 の質問にてのご回答を参考にプログラムを作成しました。 ところで、ブログによってはトラックバック先のURLを紹介するときに、 トラックバック先のブログの記事のタイトル・そのブログタイトル名やmoreなどの表示によって、 トラックバックの先のURLのリンクがHTML中に二つ以上出てくるものもあります。 例えば、楽天では、以下のHTMLのように同じURLが重複しています。 <html> <head> … <a name="trackback"></a> <H4 class="h4"> <TABLE border="0" cellpadding="0" cellspacing="0" width="100%"><TR><TD> <a href="http://plaza.rakuten.co.jp/example/20051020/" target="_blank"></a> </TD><TD align="right"> <a href="http://plaza.rakuten.co.jp/example/20051020" target="_blank </a> </TD></TR></TABLE> /div> <br /> <H4 class="h4"> <TABLE border="0" cellpadding="0" cellspacing="0" width="100%"><TR><TD> <a href="http://blogs.dion.ne.jp/example/archives/2121894.html" target="_blank"> </a> </TD><TD align="right"> <a href="http://blogs.dion.ne.jp/example/archives/2121894.html" target="_blank">TORACCHO'S ROOM E-Package2</a> </TD></TR></TABLE> </H4> … </body> </html> そこで、同じURLを重複して抽出しないようにするには、 どのようにプログラムを改正すればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • トラックバック先のURLの抽出(ライブドアのブログにて)

    以前の質問 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1725502 を参考にライブドアのブログにトラックバックされたブログのURLを取得するプログラムを、 以下のように作成しました。 class GetTBAddrLivedoor { … Pattern trackBack = Pattern.compile("<a target=\"_blank\" href=\"(http://.+)\" class=\"posttitle\">"); while((aLine = reader.readLine())!=null){ // if(aLine.indexOf("tb_tab")>=0){ if(aLine.indexOf("<a name=\"trackback\">") >=0){ flag=true; } else { if(flag && aLine.indexOf("<a name=\"comments\">")>=0) … しかし、ライブドアでは、一度リニューアルをしまして、 それが原因でリニューアル前後のブログでは、HTMLの構造が変わり、 トラックバック先のURLの記述方法が異なるようになってしまっため、 URLを取得できないものもありました。 リニューアル後の新しいブログは、 <a target="_blank" href="http://blog.livedoor.jp/example/archives/500.html" class="posttitle"> リニューアル前の古いブログは、 <a class="atrackback-post" target="_blank" href="http://yaplog.jp/example/archive/178"> という記述になっています。 そこで、一度の処理で、リニューアル後と前のブログに対してトラックバックURLを取得させる、 新しいブログの場合には、 Pattern trackBack = Pattern.compile("<a target=\"_blank\" href=\"(http://.+)\" class=\"posttitle\">"); 古いブログには、 Pattern trackBack = Pattern.compile("<a class=\"atrackback-post\" target=\"_blank\" href=\"(http://.+)\">"); このようにして、全てのライブドアのブログに対応できるプログラムにするには、 プログラムをどのように改正すればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • トラックバック先のURLのみ抽出したい(Excite・Sonetにて)

    いつもお世話になっています。 以前の「ブログのHTMLからトラックバックをしたブログのURLの抽出」 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1725502 の質問をしたものです。 No.4のご回答を参考にExiteのブログからトラックバック先のURLの抽出するプログラムを 教えていただいたプログラムを以下のように変更し、 class GetTBAddrExcite { … Pattern trackBack = Pattern.compile("<A HREF=(http://.+) TARGET=_NEW>"); while((aLine = reader.readLine())!=null){ // if(aLine.indexOf("tb_tab")>=0){ if(aLine.indexOf("<IMG SRC=http://md.exblog.jp/img/eg/ico_comment.gif WIDTH=9 HEIGHT=9>") >=0){ flag=true; } else { if(flag && aLine.indexOf("<DIV CLASS=COMMENT_INPUT>")>=0) … 実行したのですが、(例としてExcite社長の記事http://blog.excite.co.jp/yamamura/2415166/を対象とした) 結果として以下のように帰ってきてしまいました。 http://www.excite.co.jp/exblog/faq/?kind=general&id=6 TARGET=_NEW>繝倥Ν繝?/A></ B>]<BR> </DIV><DIV CLASS=COMMENT_LINE></DIV><DIV CLASS=COMMENT_TAIL><IMG SRC=htt p://md.exblog.jp/img/eg/ico_comment.gif WIDTH=9 HEIGHT=9> Tracked from <A HREF= http://example.exblog.jp/1614266 TARGET=_NEW><B>blog 貍ア遏ウ繧オ繝ュ繝ウ 繝ゥ..</B> </A> at 2005-10-28 09:51</DIV><DIV CLASS=COMMENT_BODY>繧ソ繧、繝医Ν : <A HREF=htt p://example.exblog.jp/1614266 … 抽出したいのは、http://example.exblog.jp/1614266なのですが、 HTMLの構造上のためか、余計な情報までも抽出してしまいます。(So-netも同じような問題が起きます) 抽出したいURLのみ取得させるには、 プログラムをどのように改正させればいいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 同じブログサービスでもHTMLの構造が異なるブログからのトラックバック先のURLの取得

    以前の質問 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1725502 のNo.4のご回答を参考にして、 ブログのHTMLからトラックバックをしたブログのURLの取得するプログラムを作成しています。 しかし、ブログサービスによってはリニューアルの関係か、 新しいブログと古いブログではHTMLの構造が変わってしまい、 一つのプログラムでは対応できない場合がでてきました。 例えば、ヤプログを例にして説明します。 こちらのヤプログのブログhttp://yaplog.jp/lovery-honey/archive/27 のように比較的古くからのブログであれば 参考プログラムの正規表現のところを、 以下のようにすると、URLを取得できるのですが、 Pattern trackBack = Pattern.compile("<a href=\"(http://.+)\" target=\"_blank\">"); while((aLine = reader.readLine())!=null){ if(aLine.indexOf("<a id=\"trackback\">") >=0){ flag=true; } else { if(flag && aLine.indexOf("<!-- pings -->")>=0) break; } こちらのブログhttp://yaplog.jp/chikako/archive/19 のように比較的新しいブログでは、 HTMLの構造が変わってしまい、 Pattern trackBack = Pattern.compile("<a href=\"(http://.+)\" target=\"_blank\">"); while((aLine = reader.readLine())!=null){ if(aLine.indexOf("<a name=\"tb\">") >=0){ flag=true; } else { if(flag && aLine.indexOf("<div class=\"main_cl\">")>=0) break; } と、正規表現を上記のように記述しないとURLを取得できません。 そこで、ひとつのプログラムで、上記の二つのケースに対応するようにするには、 正規表現をどのように記述して、プログラムを改正すればいいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • ブログのHTMLからtrackback:pingを抽出したい

    ブログの「この記事へのトラックバックURL」とある、 トラックバックをするためのtrackback ping URLを 抽出するプログラムをjavaで作成したいと思っています。 一般的には、trackback ping URLは以下のように、 ブログの記事のHTMLの中の、rdf:Description要素の中の、 trackback:pingのところに記述されています。 <html> <head> … <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/"> <rdf:Description rdf:about="http://blog.livedoor.jp/example/archives/500.html" trackback:ping="http://app.blog.livedoor.jp/example/tb.cgi/500" dc:title="教えてgoo" dc:identifier="http://blog.livedoor.jp/example/archives/500.html" dc:subject="example" dc:description="exaple" dc:creator="sho_athlete" dc:date="2005-10-09T23:02:14+09:00" /> </rdf:RDF> --> … </html> </head> このようなHTMLからtrackback ping URLである、 "http://app.blog.livedoor.jp/example/tb.cgi/500"を抽出したいです。 あるブログの記事のURLを入力して、 そのブログの記事のtrackback ping URLを取得するには、 どのようにプログラムを組めばいいでしょうか? また、正規表現を使う場合にはどう記述すればいいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • トラックバック先のURLの抽出でループを避けたい

    ブログのトラックバック先のURLを取得するプログラムを作っています。 例えば、ブログAの記事に、B,Cのブログがトラックバックをして ブログBにブログaが、ブログCにはブログbがトラックバックをしていて、 さらにブログaにはブログ1がトラックバックをしていたとします。 このとき、ブログB,C,a,b,1のURLを取得するプログラムをこちらのご回答を参考にしながら、以下のように作りました。 public class BlogTB { public static void main(String[] args) { ArrayList al = new ArrayList(); String url = args[0]; addUrl(al, url); String[] TBURL = (String[])al.toArray(new String[0]); for(int i = 0 ; i < TBURL.length ; i++) { System.out.println(TBURL[i]); } } private static void addUrl(ArrayList al, String url) { al.add(url); String[] TBURL = HTMLTB.getHTMLtb(url); if (TBURL[0].equals("")) return; for(int i = 0 ; i < TBURL.length ; i++) { addUrl(al, TBURL[i]); } } } HTMLTB.getHTMLtbでは、トラックバック先のURLを取得する処理を行い、その一覧をTBURLに格納します。 この操作を再帰的に繰り返して、トラックバック先のURLを取得させています。 ここで、もし上記のケースで、 ブログ1がブログaにトラックバックをしていた場合(トラックバック返し)や、 ブログ1がブログAにトラックバックをしていた場合などでは、 上記のプログラムを走らせると、ループになっていまいます。 登録しようとしているurlがalに既に登録済みかどうかのチェックなど、 重複するURLをTBURLに登録しないようにして、 ループを防ぐためには、プログラムをどのように改正すればいいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • トラックバックURLだけを抽出するツール知りませんか?

    自分のブログと関連ありそうなブログにトラックバックを したいと思うのですが、一つ一つ調べてトラックバック申請を するのではなくて、何か検索して、トラックバックのURLだけ 抽出できるようなツールってないでしょうか? 知っていたらおしえてください。

  • トラックバック先のブログのURLの一覧を取得したい

    あるブログの記事にトラックバックをしたブログのURLの一覧を取得し、 さらに、トラックバック先のブログにもトラックバックをしているブログがあれば、そのブログのURLも取得する。 (例 ブログAの記事にブログB,C,Dがトラックバックをしていて、さらにブログBにはブログE,Fがトラックバックをしていた。 この場合ブログB,C,D,E,FのURLを取得したい。) このようにして、ある話題について語られているブログ(ブログのURL)を取得するプログラムを作成したいと思っています。 プログラムの作成にはBlog Hacksで紹介されている、 トラックバックをスレッド化して表示するプログラム (http://blog.bulknews.net/cookbook/blosxom/trackback/tb_thread.htmlのtb_thread.cgi) トラックバックをたどるアプリケーション (http://blog.bulknews.net/cookbook/blosxom/trackback/tbtrace.htmlのtbtrace.cgi ) を参考にしたいと思っています。 これらのプログラム(CGI)では、トラックバックのつながりをスレッド表示したり、 関連する記事を一覧でブラウズすることができます。 しかし、私の場合は、トラックバックをしたブログのURLの一覧が取得したいので、 これらのCGIの結果では、表示されたリンクをクリックしないとそのブログのURLを取得することができません。 そこで、ブログのURLの一覧を一度に取得するには上記のプログラム(CGI)をどのように変更すればいいのでしょうか? (ちなみに、CGIで実装しなくても構いません) よろしくお願いします。

  • 他サイトの記事タイトルとURLをブログに載せたい

    FeedWind (http://feed.mikle.com/) などのサービスはありますが、 JavaScriptのコードでなく お気に入りのサイトを下のようにして ブログに書きたいのです。 <A href="(エントリーURL Aサイト)" target=_blank>(記事タイトル名)</A> <A href="(エントリーURL Bサイト)" target=_blank>(記事タイトル名)</A> <A href="(エントリーURL Cサイト)" target=_blank>(記事タイトル名)</A> <A href="(エントリーURL Dサイト)" target=_blank>(記事タイトル名)</A> 今、goo RSSリーダーから、記事タイトルとURLをコピペでしてるのですが、 時間が掛かり過ぎて困っています。 他に良い方法や便利なソフトがあればアドバイス宜しくお願いします。

  • 「トラックバック」がわかりません

    いろいろな説明を読みましたが、どうしても理解できません。 最近はじめた「LOVELOG」というブログサイトの説明を例にあげますので、わかりやすく教えてください。 よろしくお願いします。 -LOVELOGからの引用- >トラックバックとは、Aさんの投稿した記事についてBさんが他のBlogで記事にしたときに、それをAさんに通知する仕組みです。 つまり、自分は「Bさん」にあたるのですね? 誰か(Aさん)の記事をよんで、自分のブログ上でそれを話題にした時にするのが「トラックバック」なのですね? 具体的には、自分がAさんの記事を、自分のブログ上で話題にしたことを、Aさん本人に通知することを「トラックバック」というのですね? >トラックバックを行う場合は、Blogを投稿するときにトラックバック先URLの入力フォームにトラックバックを送信したいBlogのURLを入力してください。 わからないのはこの部分です。 「トラックバック先URLの入力フォーム」というのは、自分のブログの「トラックバックURL」というところのことでしょうか? 「トラックバックを送信したいBlogのURL」というのは、「あなたの記事を参考にしましたよ」と通知したい相手、つまりAさんのブログのURLのことでしょうか? つまり、自分のブログの作成画面にある「トラックバックURL」というところに、AさんのブログのURLを入力すると、Aさんに「通知される」ということでしょうか? そういう理解でいいのなら、URLを入力するだけで、Aさんに、なにが通知されるのでしょうか? 「あなたの記事を話題にしました」ということを知らせるなら、相手のブログのコメント欄にそう書いて伝えればいいような気がするので、わざわざ「トラックバック」という機能を使う意味もよくわかりません。 実際に一度やってみたらいいのかもしれませんが、なにがどうなるのかがわからないので試すこともできずに悩んでいます。 頭悪い質問ですみませんが、よろしくお願いします。