ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのHTMLファイルのタイトル取得

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。あっきーと申します。

現在、ブックマークの登録、管理ができるウェブアプリをJavaで開発しています。
そこで、ブックマークを登録する際に、入力されているURLへアクセスし、自動的にタイトルを取得するServletを作ろうと考えているのですが、どうも糸口が見いだせません。

URLをサーブレットにポストして、そこからサーブレットが外部にアクセスしHTMLを取得、正規表現で<title>タグを解析するような流れになるかと思うのですが…
Perlでなら同様な処理を行ったことがあるのですが、Javaをやるのは初めてなもので自分の手に負えそうになくなってしまったので、皆さんに力を貸していただこうと投稿させていただきました。

RSSを取得するような流れでやればいいのかな?とも考えたのですが、探し方がわるいのか参考になる文献が見つかりません…

実験サーバーの環境は下記の通りです。
Vine Linux 3.1
Tomcat 3.3(だった気がする)
J2SDK

よろしくお願いします。

コメント(9)

http://www.hellohiro.com/url.htm
この辺とか。
import java.net.URL;
import java.net.MalformedURLException;
import java.net.URLConnection;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class WebPageReaderSample {

private static URLConnection connection;

public static String titleLine;

static String title1 = "<title>";

static String title2 = "<TITLE>";

static String endTitle1 = "</title>";

static String endTitle2 = "</TITLE>";

public static void main(String[] args) {

connect("ここにつなぎたいURL入れてくださいね");
readContents();
}

/**
* URLにアクセスする
*
* @param urlString
*/
private static void connect(String urlString) {
try {
URL url = new URL(urlString);
connection = url.openConnection();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* コンテンツを読み込む
*
*/
private static void readContents() {

BufferedReader in = null;

try {
in = new BufferedReader(new InputStreamReader(connection
.getInputStream()));
findTitle(in);
} catch (IOException e) {

e.printStackTrace();
}

}

/**
* タイトルには二つ書き方があるのに注意 読み込んだ文字列一行に、<title>か<TITLE>があったらその行を代入
*
* @param in
* @throws IOException
*/
private static void findTitle(BufferedReader in) throws IOException {

String line;
while ((line = in.readLine()) != null) {
if (line.indexOf(title1) != -1 || line.indexOf(title2) != -1) {
titleLine = line;
removeTag(titleLine);

}else{
//タイトルが正常にかかれてない
}
}

}
/**
* <title></title><TITLE></TITLE>を除去する
* @param titleLine2
*/
private static void removeTag(String titleLine2) {
int beginIndex;
int endIndex;
String line = null;
if ((beginIndex = titleLine2.indexOf(title1)) != -1) {
beginIndex+=title1.length();
if ((endIndex = titleLine2.indexOf(endTitle1)) != -1) {
line = (String) titleLine2.subSequence(beginIndex,
endIndex);
} else {
// タイトルが正常にかかれてない
}

} else if ((beginIndex = titleLine2.indexOf(title2)) != -1) {
beginIndex+=title2.length();
if ((endIndex = titleLine2.indexOf(endTitle2)) != -1) {
line = (String) titleLine2.subSequence(beginIndex,
endIndex);
} else {
// タイトルが正常にかかれてない
}
}
//ここで別アプリケーションに渡しましょう
System.out.println(line);
}

}


URLからhtml文書を読み取って、
<TITLE>記述部分を抜き出すアプリケーションです。
何か判らないことがあったら聞いてください。
補足:
// タイトルが正常にかかれてない
部分は、自分で例外作ったりして、
タイトル取得できなかったらポップアップで入力フォーム出すとか、
そういう処理を入れると良いかも。です。
またまた補足
/**
* コンテンツを読み込む
*
*/
private static void readContents() {

BufferedReader in = null;
//ここから追記
String s = connection.getContentType();
s = getCharset(s);
//ここまで
try {
//引数にs追加
InputStreamReader con = new InputStreamReader(connection
.getInputStream(),s);


in = new BufferedReader(con);
findTitle(in);
} catch (IOException e) {

e.printStackTrace();
}

}
//メソッド追加
private static String getCharset(String s) {
// ここでcharsetを取り出す
return null;
}
コメントの『// ここでcharsetを取り出す』ところは実装してください。
こういう風にしないと文字化けしちゃいますね。
連レス失礼致しました。
2 コ(´・ェ・`)ロさん

title要素が複数行にわたってた場合はどうするのでしょう。
大文字小文字混じりでも可能じゃなかったでしたっけ。属性もある可能性があるから正規表現にした方がいいのでは。

やはり、SAXで読むのがいいのでは。って、xhtmlじゃないと駄目か。
どっかのhtmlパーサを使った方がいいですかね。
>title要素が複数行
ぁー、そうですねぇ。
そういう場合も考えて、
バッファか何かに追加する形のほうが安全ですかね。
あくまでJavaで。というなら正規表現が賛成ですね。

他にも色々方法があると思います。
htmlパーサは利用してないのでなんとも(っというかこういう系作ったの初)
個人的には、charsetを取り出す作業の方がめんどくさそうです。
ContentType以下にあるかもしれないし、
<?xml encoding以下にあるかもしれないし…

なんにせよ、様々な環境に合わせた『完璧』なものを作ろうとすると、
↑(私の示したソース)じゃお粗末過ぎますね…。

まぁ何かの取っ掛かりになってくれればいいかな程度で…
簡易的には行指向でいいと思います。
自分のサイトのインデックスを作る場合とかは、自分でルール決められますし。

パーサを使うのはバッファとかHTMLの省略を補完とかやってくれてるのでいいかなと。
<!--<title>hogehoge</title>-->
とかにも対応してくれたり。
対応してない問題があったら、そのパーサを作ってるコミュニティにバグレポートを投げてあげれば対応してくれる可能性もありますし。

なんにせよ、htmlは書く人に優しいので、読むのはけっこう難しいです。
<!--もう少し読む人に優しいxhtmlのが好きです。-->
>jarファイルをどうやって取り扱うのか
ライブラリなので、
『javaのクラスパスに追加』すればいいと思いますよ。

なんだか一歩進んだようで嬉しいです。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング