2008年3月4日

Dom的nodeType 定義

http://eason982.blogspot.com/2008/03/domnodetype.html
if (n.getNodeType == Node.ELEMENT_NODE) // element node 表示這是一個 tag; (n=Node )
{...}

else if (n.getNodeType == Node.TEXT_NODE) // text node 表示這是一個 tag 表示的值。
{String textValue=n.getNodeValue; //textValue即此tag之下的text內容...}

nekohtml的簡單使用

http://eason982.blogspot.com/2008/03/nekohtml.html
現在流行的HTML解析工具主要有HTML Parser和nekohtml,我就不細介紹他們了,有興趣的話可以自己google。

個人比較喜歡用nekohtml+xerces,xerces實際上也是一個XML的解析包,nekohtml建築在其之上,兩者搭配后可將網頁解析成一顆DOM樹,這樣我們對於網頁的操作就轉化為對這棵樹的操作了,而這正是它和HTML Parser的不同之處,也是我喜歡它的原因。

我們對網頁的操作主要通過org.w3c.dom中提供的接口(nekohtml+xerces提供這些接口的實現),熟悉XML解析的朋友對這個包一定不會陌生。這個包中用的比較多的接口有:Node、Document、Element、Text等。Node是DOM樹中所有節點根接口,它的子接口有Document、ProcessingInstruction、Element、Comment、Text等,具體的繼承層次請參考java doc。正如這些接口的名字說顯示的,它們對應於DOM樹中相應的元素,這里我就不細說了,下面我們通過一個例子來說明它們的使用方法。
從網頁中抽取文本是一項很平常的工作,HTML Parser中提供了一個TextExtractingVisitor來實現這一點,但nekohtml沒有現成這樣的類,我們自己寫一個也不難:

import java.io.BufferedReader;
import java.io.FileReader;

import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;


public class Demo {
public static String TextExtractor(Node root){
//若是文本節點的話,直接返回
if (root.getNodeType() == Node.TEXT_NODE) {
return root.getNodeValue().trim();
}
if(root.getNodeType() == Node.ELEMENT_NODE) {
Element elmt = (Element) root;
//拋棄腳本
if (elmt.getTagName().equals("STYLE")
elmt.getTagName().equals("SCRIPT"))
return "";

NodeList children = elmt.getChildNodes();
StringBuilder text = new StringBuilder();
for (int i = 0; i < color="#999999">//對其它類型的節點,返回空值
return "";
}
public static void main(String[] args) throws Exception{
//生成html parser
DOMParser parser = new DOMParser();
//設置網頁的預設編碼
parser.setProperty(
"http://cyberneko.org/html/properties/default-encoding",
"big5");
//input file
BufferedReader in = new BufferedReader(new FileReader("input.htm"));
parser.parse(new InputSource(in));
Document doc = parser.getDocument();
//獲得body節點,以此為根,計算其文本內容
Node body = doc.getElementsByTagName("BODY").item(0);
System.out.println(TextExtractor(body));
}
}

除了提供DOM接口外,nekohtml還有一些其他功能,如格式化網頁文本、確保網頁格式良好(well-formed)等,具體可參見nekohtml的文檔。