2008年1月22日火曜日

HTML内の見出し一覧を取得する(1)

正規表現を用いてHTML内の見出し(h1~h6要素)を取得します。
将来的には目次や索引のように、リンク付きのリスト(ol要素)を出力できるようにしたいところです。
import java.io.*;
import java.util.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

public class HTMLIndexMaker {
public static void main(String[] args) {
// ファイルを選択する
File file = selectFile(null);
if (file == null || file.isDirectory() || !file.canRead()) {
// ファイルが選択されなかった・読み込めなかった
System.exit(0);
}

// 選択したファイルを読み込む
String html = getHTML(file);

// 正規表現を用い、見出し要素を取り出す
List<String> list = getList(html);

// 取り出した要素を表示
showList(list);

// 実行終了
System.out.println("finish..." + list.size() + "個の見出しを検出しました");
}

/**
* ダイアログを開きファイルを選択する
* 参照->http://www.javadrive.jp/tutorial/jfilechooser/index.html
* @return 選択したファイル(非選択時はnull)
*/
private static File selectFile(final JFrame frame) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter("HTMLファイル", "html", "htm");
fileChooser.addChoosableFileFilter(filter);

if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
return fileChooser.getSelectedFile();
} else {
return null;
}
}

/**
* HTMLファイルの内容(テキスト)をStringに読み込む
* HTMLファイルはシフトJIS(MS932)であること
* 参考->http://www.ne.jp/asahi/hishidama/home/tech/java/file.html
*/
private static String getHTML(final File file) {
StringBuffer sb = new StringBuffer();
InputStream is = null;
Reader r = null;
BufferedReader br = null;
try {
is = new FileInputStream(file);
r = new InputStreamReader(is, "MS932");
br = new BufferedReader(r);
while (br.ready()) {
sb.append(br.readLine());
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
}
}
if (r != null) {
try {
r.close();
} catch (IOException e) {
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
return sb.toString();
}

/**
* Stringを検索し、見出し一覧を作成する
*
* @param html 検索するHTML
* @return 見出し一覧
*/
private static List<String> getList(final String html) {
List<String> list = new ArrayList<String>();
Pattern pattern = Pattern.compile("<h[1-6].+?</h[1-6]>");
Matcher matcher = pattern.matcher(html);
while (matcher.find()) {
list.add(matcher.group());
}
return list;
}

/**
* リストを表示する(デバッグ用)
*
* @param list 見出し一覧
*/
private static void showList(final List<String> list) {
ListIterator li = list.listIterator();
while (li.hasNext()) {
System.out.println(li.next().toString());
}
}
}

0 件のコメント: