生活随笔
收集整理的這篇文章主要介紹了
nekohtml的简单使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| ???? 做了一段時間的網頁解析的工作,有了些體會,寫出來和大家分享。 ???? 現在流行的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 < children.getLength(); i++) { ???? text.append(TextExtractor(children.item(i))); ??? } ??? return text.toString(); ?? } ?? //對其它類型的節點,返回空值 ?? return ""; } public static void main(String[] args) throws Exception{ ?? //生成html parser ?? DOMParser parser = new DOMParser(); ?? //設置網頁的默認編碼 ?? parser.setProperty( ???? "http://cyberneko.org/html/properties/default-encoding", ???? "gb18030"); ?? //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的文檔。 |
總結
以上是生活随笔為你收集整理的nekohtml的简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。