1. 程式人生 > >爬蟲系列(二)——網頁解析Jsoup

爬蟲系列(二)——網頁解析Jsoup

     Jsoup是一款JavaHTML解析器,可直接解析某個URL地址、HTML文字內容。它提供了一套非常省力的API,可通過DOMCSS以及類似於jQuery的操作方法來取出和操作資料。

     在爬蟲採集網頁領域主要作用是HttpClient獲取到網頁後,使用Jsoup提取網頁中需要的資訊,Jsoup支援類似JqueryCSS選擇器,來獲取需要的資料,使用非常方便。

     下面結合程式碼簡單展示如何使用Jsoup獲取需要的頁面資料。

一、Jsoup 入門demo

public class JsoupHello {

	public static void main(String[] args) throws Exception{
		CloseableHttpClient httpclient = HttpClients.createDefault(); // 建立httpclient例項
        HttpGet httpget = new HttpGet("http://www.cnblogs.com/"); // 建立httpget例項
         
        CloseableHttpResponse response = httpclient.execute(httpget); // 執行get請求
        HttpEntity entity=response.getEntity(); // 獲取返回實體
        String content=EntityUtils.toString(entity, "utf-8");
        response.close(); // 關閉流和釋放系統資源
        
        Document doc=Jsoup.parse(content); // 解析網頁 得到文件物件
        Elements elements=doc.getElementsByTag("title"); // 獲取tag是title的所有DOM元素
        Element element=elements.get(0); // 獲取第1個元素
        String title=element.text(); // 返回元素的文字
        System.out.println("網頁標題是:"+title);
        
        Element element2=doc.getElementById("site_nav_top"); // 獲取id=site_nav_top的DOM元素
        String navTop=element2.text(); // 返回元素的文字
        System.out.println("口號:"+navTop);
         
	}
}
1、使用httpClient 獲取網頁

2、使用jsoup parse解析網頁,並根據豐富的getElement方法按照不同的屬性獲取元素值

二、常用查詢dom元素方法

1、根據標籤名(tagName)查詢dom  

	    Elements elements=	doc.getElementsByTag("title"); //獲取tag是title的所有dom元素	    
	    Element element= elements.get(0); //獲取第一個
	    System.out.println(element.text());//輸出元素txt值
2、根據元素Id查詢
	    Element elementById=doc.getElementById("footer");
	    System.out.println(elementById.text());
3、根據class 名查詢
	    Elements elementsByClass=doc.getElementsByClass("post_item");
	    for(Element e:elementsByClass)
	    {
	    	System.out.println(e.html());
	    }
4、根據attribute屬性名查詢
	    //根據屬性名(如:id,width) 查詢dom
	    Elements elementsByAttr=doc.getElementsByAttribute("width");
	    for(Element e2:elementsByAttr)
	    {
	    	System.out.println(e2.toString());
	    }
5、根據attribute和attributeValue共同查詢
	    //根據屬性名&值共同查詢dom
	    Elements elementsByAttrValue=doc.getElementsByAttributeValue("width", "142");
	    System.out.println(elementsByAttrValue.toString());
三、使用Jsoup選擇器查詢dom元素

1、class類選擇器使用

          //class 使用.   中間空格
	   Elements eleLinks= doc.select(".post_item .post_item_body h3 a");	
	   for(Element el:eleLinks)
	    {
		   System.out.println(el.text());
	    }
2、帶有href超連結的a標籤查詢
	   //css語法 帶有href 屬性的a元素 
	   Elements elea= doc.select("a[href]");
	   for(Element ea:eleLinks)
	    {
		   System.out.println(ea.toString());
	    }
3、查詢圖片標籤
	   //img圖片
	   Elements imgs= doc.select("img[src$=.png]");//查詢img標籤,字尾為png的所有圖片dom
	   for(Element ea:imgs)
	    {
		   System.out.println(ea.toString());
	    }

4、根據dom Id查詢元素

//根據dom id獲取元素 ,text返回a的中文文字資訊,html返回a標籤連結資訊
	   Element eleId=doc.select("#friend_link").first();
	   System.out.println("##############純文字"+eleId.text());
	   System.out.println("##############純文字"+eleId.html());

5、獲取dom元素中指定屬性值
 Elements eleLinks= doc.select(".post_item .post_item_body h3 a");	
	   for(Element el:eleLinks)
	    {
		   System.out.println("***********************標題是"+el.text()); //獲取所有文字
		   System.out.println("***********************連線是"+el.attr("href")); //獲取所有部落格連結 dom a 裡的屬性值
	    }