プロが教えるわが家の防犯対策術!

ブログの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< …

<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/ … target=_blank>
[<a href="/example2/5242000" target=_blank>

余分な情報も抜き出してしまうので、上記を抽出しないように、
rssを含むもの、http:で始まらないものは抽出しないという条件で抽出できるようなら、
こちらの方法も教えていただきたいです。

よろしくお願いします。

A 回答 (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);
}
}
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2005/10/23 00:56

正規表現は詳しくないので、他の方にお譲りします。


まずは、参考までに下記を・・
http://java.sun.com/developer/technicalArticles/ …

http://www.atmarkit.co.jp/fjava/javatips/108java …

http://homepage2.nifty.com/tokushima/java/core/r …

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等の正規表現もおなじような感じなので、そちらを参考にされてもいいとおもいます。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2005/10/23 00:09

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

正規表現などで抽出するのがいいかもしれません。
    • good
    • 0
この回答へのお礼

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

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

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

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

よろしくお願いします。

お礼日時:2005/10/21 19:35

target=_blankがある<a~>というだけでは、本文中のリンクが該当してしまうので、うまくないと思います。


<tr id="tb_tab" style="display:block">
以降で検索するとか
ライブドアで言えば
<a class="atrackback-post"であるリンクとか
もう少し条件を限定できるようにした方がいいかと思います。

この回答への補足

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

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

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

補足日時:2005/10/21 19:28
    • good
    • 0
この回答へのお礼

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

ご指摘されたように、ヤフーの場合は、
<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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!