Fork me on GitHub

Programming Design Notes

Java 配搭 Dom4j 和 NekoHTML 輕鬆讀取 HTML 內容

| Comments

近日有需要使用程式去讀取網頁上的 HTML 內裡的資訊,如果只是單純使用 java.net.url 加上 String function 去拿取資料會非常痛苦,所以選擇了以讀取 XML 的方式去操作 HTML。雖然在 Java 裡沒有 jQuery 這樣方便的 CSS Selector 去方便我們讀取 HTML 內容,但使用 Dom4j 加上 XPath 去讀取 HTML 內容也算不錯 ( jQuery 也支援 XPath )。

不懂得 XPath 請到: http://www.w3schools.com/xpath/

在開始前要先下載相關的 Library

Dom4j: http://www.dom4j.org/dom4j-1.6.1/
NekoHTML: http://nekohtml.sourceforge.net/

Dom4j 使用 XPath 需要使用 jaxen,可以在 Dom4jlib 目錄內找到。

NekoHTML 需要的 Xerces 亦可以在 NekoHTMLlib 目錄內找到。

我做了一個簡單的程式去讀取 Yahoo Finance 的股市資料:

package com.ctlok.pro;

import java.io.IOException;

import org.cyberneko.html.parsers.DOMParser;
import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.DOMReader;
import org.xml.sax.SAXException;

public class Main {

/**
* @param args
*/
public static void main(String[] args) {
try{
String url = "http://hk.finance.yahoo.com/q?s=0005.HK";

DOMParser parser = new DOMParser();
parser.parse(url);

org.w3c.dom.Document document = parser.getDocument();
DOMReader domReader = new DOMReader();
Document doc = domReader.read(document);

//Element name should be upper case
Node name = doc.selectSingleNode("//DIV[@id='quote-bar-latest']/*/H2/node()");
Node buy = doc.selectSingleNode("//DIV[@id='quote-bar-trade-info']/TABLE/TBODY/TR[1]/TD[2]");
Node sell = doc.selectSingleNode("//DIV[@id='quote-bar-trade-info']/TABLE/TBODY/TR[2]/TD[2]");

System.out.println(name.getText());
System.out.println("Buy: " + buy.getText().substring(2));
System.out.println("Sell: " + sell.getText().substring(2));
} catch (SAXException e) {
System.out.println(e.toString());
} catch (IOException e) {
System.out.println(e.toString());
}
}
}

21 行的程式碼是向 URL 讀取 HTML 資料。

25 行的程式碼是將 W3C Document 轉換成 Dom4j Document

28, 29, 30 行則是使用 XPath 去讀取指定元素,有一點要注意的是元素名稱是英文大寫。

而結果會是以下這樣:
匯豐控股有限公司
Buy: 77.700
Sell: 77.750

相關書籍: Java and XMLXSLT 2.0 and XPath 2.0 Programmer's Reference (Programmer to Programmer)Xpath and Xpointer: Locating Content in XML Documents