みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

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

よろしくお願いします。

投稿日時 - 2005-10-21 00:16:07

QNo.1725502

すぐに回答ほしいです

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

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);
}
}

投稿日時 - 2005-10-22 14:55:19

お礼

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

無事トラックバック先のURLを取得できました。

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

投稿日時 - 2005-10-23 00:56:43

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

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

回答(4)

ANo.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等の正規表現もおなじような感じなので、そちらを参考にされてもいいとおもいます。

投稿日時 - 2005-10-22 07:14:40

お礼

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

私も正規表現は、まだまだ勉強不足なので、
とても参考になります。

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

投稿日時 - 2005-10-23 00:09:29

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

正規表現などで抽出するのがいいかもしれません。

投稿日時 - 2005-10-21 13:00:28

お礼

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

ヤフーだけでなく他のブログにても試してみたいのですが、
ブログのHTMLが各ブログごとで違うので、
javascriptや独自タグが入っていることが考えれれます。

ご回答にもありましたように、正規表現を使った方がいいかもしれません。

正規表現を使う場合はどのようにプログラムを書けばよろしいでしょうか?

よろしくお願いします。

投稿日時 - 2005-10-21 19:35:15

ANo.1

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

投稿日時 - 2005-10-21 04:09:41

補足

ちなみに、トラックバック先のURLを取得する方法に、
トラックバックPing URL にクエリパラメータ __mode=rss を付加することによって、
RSS データをレスポンスとしてTrackbackURLの一覧を出力することができまして、
ライブドアやヤプログ・ココログなど、
全体のブログサービスの約4割のブログに対して、
この方法でトラックバック先のURLを取得できることを確認しました。

ですが、ヤフーや楽天などの残りの6割のブログでは__mode=rssに対応していないため、
今回質問したようにHTMLからの取得を試みています。

多くのブログが今回質問した方法を基に、問題点を解決するように、
各ブログのHTMLの構造に対応するように上手くプログラムを組めば、
トラックバック先のURLを取得することができるのではと考えています。

投稿日時 - 2005-10-21 19:28:30

お礼

ご回答ありがとうございます。
いつもお世話になっております。

ご指摘されたように、ヤフーの場合は、
<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を取得する
サンプルコードを紹介していただけないでしょうか?

よろしくお願いします。

投稿日時 - 2005-10-21 19:27:58

あなたにオススメの質問