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

このQ&Aのポイント
  • ブログサービスによってHTMLの構造が異なり、トラックバック先のURLの取得に問題が発生しています。
  • 古いブログと新しいブログでは正規表現の記述が異なり、一つのプログラムでは対応できません。
  • どのように正規表現を記述してプログラムを改正すれば、複数のブログサービスに対応できるでしょうか?
回答を見る
  • ベストアンサー

同じブログサービスでも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を取得できません。 そこで、ひとつのプログラムで、上記の二つのケースに対応するようにするには、 正規表現をどのように記述して、プログラムを改正すればいいでしょうか? よろしくお願いします。

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

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

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

#1です。 >リニューアルのたびにプログラムを変えなくてはいけないのが面倒ですが。 心情的には理解できますが、明確な仕様がない以上しかたのないことだと言えます。 ところで、質問に直接は関係のない話になりますが、実際のコードの記述はインターフェースを使って行うことで、すっきりとしたものになります。 (私なら絶対にそうします) 例えば、 interface ITrackbackParser {  public URL getTbUrl(String htmlText); } とでもしておき、質問文の2つのロジックはそれぞれ別のクラスにします(ITrackbackParserを実装すること)。 メインのコードの記述では、 ITrackbackParser[] parsers = new ITrackbackParser[]{new YahooParser1(), new YahooParser2()}; for(int i = 0 ; i < parsers.length ; i++){ URL url = parsers[i].getTbUrl(htmlText); if(url != null){   break; } } のようになります。 ITrackbackParserの仕様はもう少し検討する余地はあります。(例えばパーサー名を取得するgetParserNameを追加する等) こうすることで、全体のコードがすっきりし、各解析ロジックを完全に分離できるので、追加や削除が楽になります。

shows
質問者

お礼

ご回答ありがとうございます。 丁寧なアドバイスをいただき、 とても参考になりました。 ありがとうございました。

その他の回答 (1)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

一方でダメなら、もう一方を試せばいいんじゃないですか? 一発でやろうとすると、もっと複雑なパターンが出てきたときに、どうやっても対応できなくなりますから、その位の余裕を持たせた方がいいと思いますけど。

shows
質問者

お礼

ご回答ありがとうございます。 とりあえずは、if文で制御させて、 二つを併用したプログラムにしました。 リニューアルのたびにプログラムを変えなくてはいけないのが面倒ですが。 何か、半永久的に一つの処理で対応させたいのですが、 今のところは、上記の方法で対応したいと思います。

関連するQ&A

  • トラックバック先の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の抽出

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

    • ベストアンサー
    • Java
  • 実行対象のブログのURLは抽出させない

    以前の質問http://oshiete1.goo.ne.jp/kotaeru.php3?q=1725502 のご回答のプログラムを改良してトラックバックされたブログURLを抽出する 以下のようなプログラムを作成しました。 (省略部分は参考プログラムとほぼ同じ。) class GetTBurlLivedoor { public static String[] getTBaddrLivedoor(String urlString){ … //ブログのURLを抽出。ただし、スペースの都合上ここではライブドアのみ抽出とする //indexOfを用いての範囲指定はせず、HTMLすべてに対してパース Pattern trackBack = Pattern.compile("http://blog.livedoor.jp/.*/archives/\\d+.html"); while((aLine = reader.readLine())!=null){ Matcher m = trackBack.matcher(aLine); if(m.find()){ addr+=m.group(0)+","; } … public static void main(String[] args){ String url = args[0]; //実行例 http://blog.livedoor.jp/takapon_ceo/archives/50030785.html String[] TBaddr = getTBaddrLivedoor(url); for(int i=0;i<TBaddr.length;i++) System.out.println(TBaddr[i]); } } そこで、URLを抽出する際に、実行対象となるブログ自身に関するURL 例)http://blog.livedoor.jp/takapon_ceo/archives/50034644.html などは抽出しないようにするため、 そのブログ自身のIDを含むURLは抽出しないような処理をしたいと思います。 例えば、ライブドアでは、ブログのIDは、 http://blog.livedoor.jp/ ID /archives/50030785.html となっているので、このID(実行例ではtakapon_ceo)を含むURLは抽出しないようにさせたいです。 このようにするには、どのようにプログラムを組めばよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 文字化けを直したい

    以下のようなHTMLから対象サイトの本文を取得するプログラムを作成しました。 import java.net.*; import java.io.*; import java.util.regex.*; public class GetBloghonbun { public static void main(String args[]) { String url = args[0]; boolean flag=false; try { String aLine; byte buf[] = new byte[4096]; URL u = new URL(url); DataInputStream di = new DataInputStream(u.openStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(di)); while((aLine=reader.readLine())!=null) { if(aLine.indexOf("<div class=\"main\">") >=0){ flag=true; } else { if(flag && aLine.indexOf("<div class=\"posted\">")>=0) break; } if(flag==false) continue; Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL); Matcher matcher = pattern.matcher(aLine); String string = matcher.replaceAll(""); System.out.println(string); } } catch(Exception e) { System.out.println("例外" + e + "が発生しました"); } } } このプログラムを次のサイト(ブログ)について実行しました。 http://blog.livedoor.jp/takapon_ceo/archives/50035965.html しかし、実行結果として、文字化けした結果の出力となりました。 対象サイトがEUCなので、それをSjisに直せばよいのでしょうか? 実行結果が文字化けしないようにするには、 どのようにプログラムを組めばよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • ブログの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
  • 文字化けを直したい(Unicode(UTF8)の場合)

    以下のようなHTMLから対象サイトの本文を取得するプログラムを作成しました。 import java.net.*; import java.io.*; import java.util.regex.*; public class GetBloghonbun { public static void main(String args[]) { String url = args[0]; boolean flag=false; try { String aLine; byte buf[] = new byte[4096]; URL u = new URL(url); DataInputStream di = new DataInputStream(u.openStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(di)); while((aLine=reader.readLine())!=null) { if(aLine.indexOf("<<DIV CLASS=POST_BODY>") >=0){ flag=true; } else { if(flag && aLine.indexOf("<<DIV CLASS=POST_TAIL>")>=0) break; } if(flag==false) continue; Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL); Matcher matcher = pattern.matcher(aLine); String string = matcher.replaceAll(""); System.out.println(string); } } catch(Exception e) { System.out.println("例外" + e + "が発生しました"); } } } このプログラムを次のサイト(ブログ)について実行しました。 http://blog.excite.co.jp/haagen-dazs/1632409/ しかし、対象サイトがUnicode(UTF8)なので実行結果として、 文字化けした結果の出力となりました。 対象サイトがEUCの場合には、 BufferedReader reader = new BufferedReader(new InputStreamReader(di,"euc-jp")); とすればよいと以前に同様の質問をした際に教えていただきました。 対象サイトがUnicode(UTF8)の場合に、 実行結果が文字化けしないようにするには、 どのようにすればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • トラックバック先のブログの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で実装しなくても構いません) よろしくお願いします。

  • ブログのHTMLからtrackback:pingの抽出(HTMLにrdf要素がないブログ)

    以前、「ブログのHTMLからtrackback:pingを抽出したい」 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1710072 の質問をしたものです。 前の質問でしたように、一般的なブログでは、trackback ping URLは、 ブログの記事のHTMLの中の、rdf:Description要素の中の、 trackback:pingのところに記述されています。 しかし、上記に当てはまらないブログもありました。 例えば、ヤプログやドリコムブログです。 これらのブログでは、HTML中でrdf:Description要素自体が記述されておらず、 以下のような形でtrackback ping URLが記述されています。 例)ヤプログ(trackback ping URLはhttp://yaplog.jp/example/tb_ping/22) <html lang="ja"> <head> <title> … <td width="5" background="/blog/template/37/img/entryl.gif">&nbsp;</td> <td> <table width="350" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="entry_text"> この記事へのトラックバックURL<br /> http://yaplog.jp/example/tb_ping/22<br><br> <div class="comment_layer"> </div>  </td> </tr> </table> </td> <td width="5" background="/blog/template/37/img/entryr.gif">&nbsp;</td> </tr> <tr> … </body> </html> このようなHTMLからtrackback ping URLである、 http://yaplog.jp/example/tb_ping/22を抽出したいです。 ブログの記事のURLを入力して、 そのブログの記事のtrackback ping 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

専門家に質問してみよう