import java.util.*;
import org.htmlparser.*;
import org.htmlparser.filters.*;
import org.htmlparser.http.*;
import org.htmlparser.util.*;
import org.htmlparser.tags.*;
import org.htmlparser.nodes.*;
// usage: java WebPage
public class WebPage {
private Parser parser;
private NodeFilter filter;
private String url;
private ArrayList linkList;
private ArrayList imageList;
/** テスト用 main */
public static void main (String [] args) {
WebPage page = new WebPage();
page.setURI(args[0]);
// 抽出対象を A に絞り込み
page.setFilter(new TagNameFilter("A"));
page.run();
Iterator iterator;
ArrayList list;
// リンク先一覧
list = page.getLinkList();
iterator = list.iterator();
while(iterator.hasNext()) {
String url = (String)iterator.next();
System.out.println(url);
}
// 画像一覧
list = page.getImageList();
iterator = list.iterator();
while(iterator.hasNext()) {
String url = (String)iterator.next();
System.out.println(url);
}
}
public WebPage() {
parser = new Parser();
filter = null; // null のままだと絞り込みなしで動作する
url = null;
linkList = new ArrayList(100);
imageList = new ArrayList(100);
// いろいろ情報を表示する場合は以下のコメントを外す
// parser.setFeedback(Parser.STDOUT);
// Parser.getConnectionManager().setMonitor(parser);
// リダイレクトに対応
Parser.getConnectionManager().setRedirectionProcessingEnabled(true);
// クッキーに対応
Parser.getConnectionManager().setCookieProcessingEnabled(true);
}
public void setURI(String url) {
this.url = url;
}
public void setFilter(NodeFilter filter) {
this.filter = filter;
}
public ArrayList getLinkList() {
return linkList;
}
public ArrayList getImageList() {
return imageList;
}
public void run() {
try {
// 取りに行くページのURLを指定
parser.setResource(url);
// filter の条件にあうノードのリストを取得
NodeList list = parser.parse(filter);
NodeIterator i = list.elements();
while (i.hasMoreNodes())
processMyNodes(i.nextNode());
}
catch (EncodingChangeException ece) {
// 文字コードが想定と違った場合
try {
// reset() すると検出された文字コードで再度処理することができる
parser.reset();
NodeList list = parser.parse(filter);
NodeIterator i = list.elements();
while (i.hasMoreNodes())
processMyNodes(i.nextNode());
}
catch (ParserException e) {
e.printStackTrace();
}
}
catch (ParserException e) {
e.printStackTrace();
}
}
private void processMyNodes(Node node) throws ParserException {
if (node instanceof TextNode) {
// TextNode (タグではなくて文字列のノード)
// Node から TextNode にキャストすると、TextNode のメソッドが使える
TextNode text = (TextNode)node;
// ここにテキストに対してしたい処理を書く
// System.out.println("text: \"" + text.getText() + "\"");
}
else if (node instanceof RemarkNode) {
// RemarkNode (コメントのノード )
// Node から RemarkNode にキャスト
RemarkNode remark = (RemarkNode)node;
// ここにコメントに対してしたい処理を書く
}
else if (node instanceof TagNode) {
// TagNode (タグのノード)
// Node から TagNode にキャスト
TagNode tag = (TagNode)node;
// String tagName = tag.getTagName();
// System.out.println("tag name: " + tagName);
// System.out.println("tag text: " + tag.getText()); // 属性の記述がテキストとして見える
// タグごとの処理
if(tag instanceof LinkTag) {
LinkTag link = (LinkTag)tag;
// getLink()は相対URLは絶対URLに変換して返す
// System.out.println("Link: " + link.getLink());
// linklist に抽出した URL を追加
linkList.add(link.getLink());
}
else if(tag instanceof ImageTag) {
ImageTag image = (ImageTag)tag;
imageList.add(image.getImageURL());
}
// タグは一般に入れ子になっているので、
// (例えばタグに囲まれている文字列はタグの子ノードになる)
// getChildren() を使ってタグノードの子ノードを再帰的に処理
NodeList nl = tag.getChildren();
if (nl != null) {
NodeIterator i = nl.elements();
while(i.hasMoreNodes())
processMyNodes(i.nextNode());
}
}
}
}