import java.io.Serializable;
import java.net.HttpURLConnection;
import java.net.URLConnection;
import org.htmlparser.*;
import org.htmlparser.filters.*;
import org.htmlparser.http.*;
import org.htmlparser.lexer.*;
import org.htmlparser.util.*;
import org.htmlparser.visitors.*;
import org.htmlparser.tags.*;
import org.htmlparser.nodes.*;
public class SimpleParser3 {
public static void main (String [] args) {
Parser parser = null;
NodeFilter filter = null;
if (args.length < 1 || args[0].equals ("-help")) {
System.out.println ("HTML Parser v" + Parser.getVersion () + "\n");
System.out.println ();
System.out.println ("Syntax : java SimpleParser3"
+ " <file/page> [type]");
System.out.println (" <file/page> the URL or file to be parsed");
System.out.println (" type the node type, for example:");
System.out.println (" A - Show only the link tags");
System.out.println (" IMG - Show only the image tags");
System.out.println (" TITLE - Show only the title tag");
System.out.println ();
System.out.println ("Example : java SimpleParser3"
+ " http://www.yahoo.com");
System.out.println ();
}
else
try {
parser = new Parser ();
if (1 < args.length)
filter = new TagNameFilter (args[1]);
else
{
filter = null;
// for a simple dump, use more verbose settings
parser.setFeedback (Parser.STDOUT);
Parser.getConnectionManager ().setMonitor (parser);
}
Parser.getConnectionManager ().setRedirectionProcessingEnabled (true);
Parser.getConnectionManager ().setCookieProcessingEnabled (true);
parser.setResource (args[0]);
NodeList list = parser.parse(filter);
NodeIterator i = list.elements ();
while (i.hasMoreNodes ())
processMyNodes(i.nextNode ());
}
catch (EncodingChangeException ece) {
try {
// 文字コードが想定と違った場合、検出された文字コードで再度処理
parser.reset ();
NodeList list = parser.parse(filter);
for (NodeIterator i = list.elements (); i.hasMoreNodes (); )
processMyNodes (i.nextNode ());
}
catch (ParserException e) {
e.printStackTrace ();
}
}
catch (ParserException e) {
e.printStackTrace ();
}
}
static void processMyNodes (Node node) throws ParserException {
if (node instanceof TextNode)
{
// Node から TextNode にキャスト
TextNode text = (TextNode)node;
// ここにテキストに対してしたい処理を書く
System.out.println("text: \"" + text.getText() + "\"");
}
else if (node instanceof RemarkNode)
{
// Node から RemarkNode にキャスト
RemarkNode remark = (RemarkNode)node;
// ここにコメントに対してしたい処理を書く
}
else if (node instanceof HeadTag)
{
// Node から HeadTag にキャスト
HeadTag tag = (HeadTag)node;
NodeList nl = tag.getChildren ();
if (nl != null)
for (NodeIterator i = nl.elements (); i.hasMoreNodes();) {
Node nextNode = i.nextNode();
if(nextNode instanceof TitleTag) {
System.out.println("Title: " + ((TitleTag)nextNode).getTitle());
break;
}
}
}
else if (node instanceof 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;
// 相対URLは絶対URLに変換される
System.out.println("Link: " + link.getLink());
}
// ここにタグそのものに対してしたい処理を書く
// ...
// getChildren() を使ってノード内のノードを再帰的に処理
NodeList nl = tag.getChildren ();
if (null != nl)
for (NodeIterator i = nl.elements (); i.hasMoreNodes(); )
processMyNodes (i.nextNode ());
}
}
}
SimpleParser3.java