爬蟲工具:淺談HtmlCleaner+XPath解析HTML

現在常用的網頁解析工具有: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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章