現在常用的網頁解析工具有:Jsoup,JsoupXpath,HtmlCleaner。
jsoup 是一款Java 的XML、HTML解析器,可直接解析某個URL地址、HTML文本內容和已經存在的文件。
JsoupXPath是基於Jsoup的拓展,使用路徑的形式解析XML和HTML文檔。核心類爲JXDocument;JsoupXPath的節點對象JXNode不僅可以獲取標籤節點,還可以獲取屬性節點
HtmlCleaner是一個開源的Java語言的Html文檔解析器。HtmlCleaner能夠重新整理HTML文檔的每個元素並生成結構良好(Well-Formed)的 HTML 文檔。默認它遵循的規則是類似於大部份web瀏覽器爲創文檔對象模型所使用的規則。然而,用戶可以提供自定義tag和規則組來進行過濾和匹配。它被設計的小,快速,靈活而且獨立。HtmlCleaner也可用在Java代碼中,當命令行工具或Ant任務。 解析後編程輕量級文檔對象,能夠很容易的被轉換到DOM或者JDom標準文檔,或者通過各種方式(壓縮,打印)連續輸出XML。
Jsoup解析:
第一步:創建Document
Jsoup創建Document的方式:
第一種:解析一個字符串獲取Document對象
String html = "<div><a href='#'>jsoup測試</a></div>";
Document doc = Jsoup.parse(html);
第二種:解析一個html文檔獲取Document對象
String path = test.class.getResource("/html/example.html").getPath();
Document doc = Jsoup.parse(new File(path),"utf-8");
第三種:解析一個URL資源獲取Document對象
Connection conn = Jsoup.connect("https://www.hao123.com");
Document doc = conn.get();
第二步:獲得Element對象
第一種:通過標籤屬性獲得Element對象
Element getElementById (String id )
Elements getElementsByTag (String tagName ) 通過標籤獲取一個元素集合對象
Elements getElementByClass( String className) 通過元素類名獲取一個元素集合對象
第二種:通過css選擇器獲得元素對象
Elements select (String cssQuery) 通過css選擇器獲取Elements對象
Element selectFirst(String cssQuery) 通過css選擇獲得第一個Element對象
第三步:從Element對象中解析最終結果
for (Element headline : newsHeadlines) {
System.out.println("jsoup selector text=" + headline.html() + " : class=" + headline.attr("class") );
pqnr = headline.html();
return_map.put(dataMxDm, pqnr);
}
JsoupXPath解析
第一步:創建JXDocument對象
public JXDocument (Document doc) 使用Document對象來創建JXDocument對象
String path = test.class.getResource("/html/example.html").getPath();
Document doc = Jsoup.parse(new File(path),"utf-8");
JXDocument jxd = new JXDocument(doc);
第二步:獲取JXNode對象
List<JXNode> selN( String xpath) 找到路徑返回所有滿足的節點對象集合
類似Document的select()方法
JXNode selNOne(String xpath) 找到路徑返回的第一個滿足的節點對象
類似Document的selectFirst()方法
第三步:解析JXNode對象
JXNode node = (JXNode) jxDocument.selNOne(xpath1);
//JXNode node = (JXNode) jxDocument.selOne(xpath2);
System.out.println("8888"+node.getTextVal());
List<Object> rs = jxDocument.sel(xpath1);
for (Object o:rs){
if (o instanceof Element){
int index = ((Element) o).siblingIndex();
System.out.println(index);
}
System.out.println("99999: "+o.toString());
}
HtmlCleaner解析
第一步:首先我們要創建一個HtmlCleaner
HtmlCleaner htmlCleaner = new HtmlCleaner();
第二步:然後我們就可以用他來獲取文件內容content。
TagNode tagNode= htmlCleaner.clean(content);
content可以是文件,也可以是hmtl字符串。
第三步:通過XPath路徑解析獲得Object[]對象:
Object[] tbodyNodeArray = tagNode.evaluateXPath(XPath);
這裏XPath爲你要讀取的目錄,可以是/body/table[2]/tbody/tr/td[2]/table[4]/tbody/tr/td/table/tbody
這樣,直接讀取到table。
ReadFileUtil readFileUtil = new ReadFileUtil();
html = readFileUtil.readFilePath(url);
HtmlCleaner hc = new HtmlCleaner();
TagNode tn = hc.clean(html);
Object[] ns = tn.evaluateXPath(xpath);
for(Object on : ns) {
TagNode n = (TagNode) on;
System.out.println("HtmlCleaner xpath text="+n.getText() + " : class=" + n.getAttributeByName("class") );
pqnr = n.getText().toString();
}
如何獲取Xpath路徑以及CSS選擇器路徑:
打開目標網頁,按F12.然後選中點中紅框中的箭頭,點擊序號,及定位到序號在源文件的位置,然後右鍵,選擇Copy,Copy Xpath 選取的就是XPath路徑,Copy selector 選中的就是CSS選擇器路徑。
Demo下載:
https://download.csdn.net/download/u013310119/12274974