研究の関係でJavaのHTMLパーサを探していたら、いくつか候補を見つけたけど、CyberNeko HTML Parserを使ってみることにした。Xercesに依存しているのでxercesを用意しないといけないけど、パース後のDOM木の操作にJavaのXMLの標準APIをそのまま使えるのが嬉しい。試しにこのブログの最新タイトルを取り出すプログラムを作ってみた。DOMParser以外はJava1.5以降のJava標準APIを使っている
import org.cyberneko.html.parsers.DOMParser; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Document; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import javax.xml.xpath.XPathExpression; public class Test{ public static void main(String[] args) throws Exception{ DOMParser parser = new DOMParser(); parser.parse("http://d.hatena.ne.jp/d-kami/"); Document document = parser.getDocument(); XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); XPathExpression expr = xpath.compile("//UL[@class='hatena-section']/LI"); Object result = expr.evaluate(document, XPathConstants.NODESET); NodeList nodeList = (NodeList)result; for(int i = 0; i < nodeList.getLength(); i++){ Node node = nodeList.item(i); String title = xpath.evaluate("A/text()", node); System.out.println(title); } } }