java爬蟲簡單例子——附jsoup的select用法詳解

dawn009發表於2015-06-09
在上一篇博文 java爬取網頁內容 簡單例子(1)——使用正規表示式 裡面,介紹瞭如何使用正規表示式去解析網頁的內容,雖然該正規表示式比較通用,但繁瑣,程式碼量多,現實中想要想出一條簡單的正規表示式 對於沒有很好正規表示式基礎的人——比如說我T_T——是一件蠻困難的事。這一篇,我們改用jsoup,一個強大的解析html工具,去解析html,你 會發現,一切都變得很容易。
 
 
 
【準備工作】
 
:jsoup-1.6.1.jar
 
 
 
【先看效果】
 
目標網站:中國天氣 
 
目的:獲取今天的天氣
 
目標HTML程式碼:
 
 
複製程式碼
  •      

    今天

         

    8日

         
             
         

    雷陣雨

         

    33°C

         

    25°C

         

               
                     
                     
               
                微風
         
         
    複製程式碼
     
     
    解析的java程式碼:
     
    (1)審查網頁元素後發現,我們要的內容在上面的目標HTML程式碼中,在整個網頁中是在 class="dn on" data-dn="7d1" 的
  •  
    (2)“今天” 兩字在

     
    (3)“8日” 兩字在

     
    (4)“雷陣雨” 三字在 class="wea" 中
     
    (5)“33” 在第一個
     
    (6)“25” 在第二個
     
    (7)“微風” 兩字在 第三個
     
    有了上面的分析,要獲取到這些天氣內容就易如反掌了。如下java程式碼:
     
     
    複製程式碼
     1 package com.zjm.
     2 
     3 import java.io.IOException;
     4 
     5 import org.jsoup.Jsoup;
     6 import org.jsoup.nodes.Document;
     7 import org.jsoup.select.Elements;
     8 
     9 public class TestJsoup {
    10     
    11     public  Document getDocument (String url){
    12         try {
    13             return Jsoup.connect(url).get();
    14         } catch (IOException e) {
    15             e.printStackTrace();
    16         }
    17         return null;
    18     }
    19 
    20     public static void main(String[] args) {
    21         TestJsoup t = new TestJsoup();
    22         Document doc = t.getDocument("");
    23         // 獲取目標HTML程式碼
    24         Elements elements1 = doc.select("[class=dn on][data-dn=7d1]");
    25         // 今天
    26         Elements elements2 = elements1.select("h1");
    27         String today = elements2.get(0).text();
    28         System.out.println(today);
    29         // 幾號
    30         Elements elements3 = elements1.select("h2");
    31         String number = elements3.get(0).text();
    32         System.out.println(number);
    33         // 是否有雨
    34         Elements elements4 = elements1.select("[class=wea]");
    35         String rain = elements4.get(0).text();
    36         System.out.println(rain);
    37         // 高的溫度
    38         Elements elements5 = elements1.select("span");
    39         String highTemperature = elements5.get(0).text()+"°C";
    40         System.out.println(highTemperature);
    41         // 低的溫度
    42         String lowTemperature = elements5.get(1).text()+"°C";
    43         System.out.println(lowTemperature);
    44         // 風力
    45         Elements elements6 = elements1.select("i");
    46         String wind = elements6.get(2).text();
    47         System.out.println(wind);
    48     }
    49 }
    複製程式碼
     
     
    結果列印出:
     
    1 今天
    2 8日
    3 雷陣雨
    4 33°C
    5 25°C
    6 微風
     
     
    【詳解】
     
    附:
     
    jsoup的官方中文文件為:
    API為:
    java程式碼第13行:
     
      從文件中我們可用看出,獲取資料來源的方法有三:
     
    (1)從一段html程式碼字串獲取:  Document doc = Jsoup.parse(html);
     
    (2)從一個url獲取:        Document doc = Jsoup.connect("").get();
     
    (3)從一個html檔案獲取      File input = new File("/tmp/input.html");    Document doc = Jsoup.parse(input, "UTF-8", "");
     
    這裡,我們採取了第二種方法,從url中獲取。
     
    java程式碼第24、26、30、34、38行:
     
      Document 繼承自 Element 類, 而Element類有一個很好的方法,叫select , 這個選擇器幾乎無所不能。快速從一堆html程式碼中獲取我們想要的一段,我覺得使用select最方便。下面我們來看怎麼使用select方法來查詢。
     
    注:以下表格的結果都是使用以下語句列印出來的
     
    for(Element e : elements) {
                System.out.println(e.text());
            }
     
     
    select詳解
    描述 測試的HTML程式碼 select寫法
    結果
     
    透過
     
    標籤名
     
    來查詢
     
    33
    25
     
     
    Elements elements = doc.select("span");
     
     
    注:透過標籤來查詢,直接寫 "標籤名" 就好,不需要尖括號。
    33
    25
     
     
    透過 
     
    id 
     
    來查詢
     
     
     
    36
     
    20
     
     
     
    Elements elements = doc.select("#mySpan");
     注:透過id來查詢,使用方法跟css指定元素一樣,用#
     
    36
     
     
     透過
     
     class名
     
     來查詢
     
     
     
    36
    20
     
     
     
     
     
    Elements elements = doc.select(".myClass");
    注:透過id來查詢,使用方法跟css指定元素一樣,用 . 
     
    36
     
     
     利用標籤內 
     
    屬性名
     
     查詢元素
     
     
    36
    36
     
     
     
    Elements elements = doc.select("span[class=class1]span[id=id1]");
     注:規則為 標籤名【屬性名=屬性值】,標籤名可寫可不寫,多個屬性即多個【】,如上。
     
     
    36
     
     
    利用標籤內 
     
    屬性名字首 
     
    查詢元素
     
     
    36
    22
     
     
     
    Elements elements = doc.select("span[^cl]");
     注:規則為 標籤名【^屬性名字首】,標籤名可寫可不寫,多個屬性即多個【】。
     
     
    36
    22
     
     
     利用標籤內
     
    屬性名+正規表示式
     
    查詢元素
     
     
    36
    22
     
     
     
    Elements elements = doc.select("span[class~=^AB]");
     注:規則為 標籤名【屬性名~=正規表示式】,以上的正規表示式的意思是查詢以class值以AB為開頭的標籤,標籤名可寫可不寫,多個屬性即多個【】
     
     
    36
     
     
     利用標籤
     
    文字包含某些內容
     
    來查詢
     
     
    36
    22
     
     
     
     
     
    Elements elements = doc.select("span:contains(3)");
     
     注:規則為 標籤名:contains(文字值)
     
     
    36
     
     
     利用標籤
     
    文字包含某些內容+正規表示式
     
    來查詢
     
     
    36
    22
     
     
     
    Elements elements = doc.select("span:matchesOwn(^3)");
     注:規則為 標籤名:matchesOwn(正規表示式),以上的正則表式的意思是以文字值以3為開頭的標籤
     
     
    36
     
     
    關於select,還有一些其他的查詢方法,以上只列出個人覺得比較好用、常用的語法。
     
    select方法返回的是一個Elements 物件,裡面包含著找到的所有節點。遍歷Elements ,透過get(index),就可以拿出具體的 節點了。透過節點的text()方法,就可用拿出文字值。
     
    而想得到節點的其他屬性,可以看API的介紹。


    出處:

    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1693161/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章