ブログの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:で始まらないものは抽出しないという条件で抽出できるようなら、
こちらの方法も教えていただきたいです。
よろしくお願いします。
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);
}
}
No.3
- 回答日時:
正規表現は詳しくないので、他の方にお譲りします。
まずは、参考までに下記を・・
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等の正規表現もおなじような感じなので、そちらを参考にされてもいいとおもいます。
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が入った場合などはうまく動作してくれないとおもいますので、この方法でやるとかえって遠回りになります。
正規表現などで抽出するのがいいかもしれません。
ご回答ありがとうございます。
ヤフーだけでなく他のブログにても試してみたいのですが、
ブログのHTMLが各ブログごとで違うので、
javascriptや独自タグが入っていることが考えれれます。
ご回答にもありましたように、正規表現を使った方がいいかもしれません。
正規表現を使う場合はどのようにプログラムを書けばよろしいでしょうか?
よろしくお願いします。
No.1
- 回答日時:
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を取得することができるのではと考えています。
ご回答ありがとうございます。
いつもお世話になっております。
ご指摘されたように、ヤフーの場合は、
<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を取得する
サンプルコードを紹介していただけないでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- gooブログ 自分のブログを検索エンジンに載せる方法について 1 2022/07/02 22:58
- HTML・CSS スクロールすると追従する画像のコードを書いているのですが、追従する画像の大きさの調節が上手くいきませ 2 2022/04/18 12:52
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数の変数を宣言する時、同時...
-
変数名の付け方
-
private static という変数の修飾
-
SQLを連続発行する時の正しい(?...
-
生成したインスタンスを削除す...
-
インスタンス参照でアクセスで...
-
VB.NET getとsetの概念がわかり...
-
文字列を日付に変換でParseExce...
-
C#において、同じインスタンス...
-
他のファイルの変数参照
-
変数の参照でエラーが出てしま...
-
newしないインスタンス?実体化...
-
vb.netでFAXを送信する方法
-
インスタンスのハンドル
-
エクセル(複数インスタンス)...
-
JavaのSingletonパターンのpriv...
-
フォームのCheck boxとOLEObjec...
-
フォームの存在をチェックする方法
-
フィールドでのnewとコンストラ...
-
String a = "a"; と String b =...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
SQLを連続発行する時の正しい(?...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
VB6.0で、DLLを動的に参照したい
-
String a = "a"; と String b =...
-
C#「オブジェクト参照が必要で...
-
newしないインスタンス?実体化...
-
「インスタンス」の意味をわか...
-
SetWindowsHookExで質問
-
フィールドでのnewとコンストラ...
おすすめ情報