こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

同じブログサービスでも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を取得できません。

そこで、ひとつのプログラムで、上記の二つのケースに対応するようにするには、
正規表現をどのように記述して、プログラムを改正すればいいでしょうか?

よろしくお願いします。

投稿日時 - 2005-11-11 01:04:28

QNo.1771493

すぐに回答ほしいです

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

#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を追加する等)


こうすることで、全体のコードがすっきりし、各解析ロジックを完全に分離できるので、追加や削除が楽になります。

投稿日時 - 2005-11-14 09:27:46

お礼

ご回答ありがとうございます。

丁寧なアドバイスをいただき、
とても参考になりました。

ありがとうございました。

投稿日時 - 2005-11-15 23:12:49

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

一方でダメなら、もう一方を試せばいいんじゃないですか?


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

投稿日時 - 2005-11-11 12:13:01

お礼

ご回答ありがとうございます。

とりあえずは、if文で制御させて、
二つを併用したプログラムにしました。

リニューアルのたびにプログラムを変えなくてはいけないのが面倒ですが。

何か、半永久的に一つの処理で対応させたいのですが、
今のところは、上記の方法で対応したいと思います。

投稿日時 - 2005-11-13 00:12:56

あなたにオススメの質問