2015年4月15日 星期三

【筆記】在Java中爬取網頁內容-使用jsoup來做html parser

日前因工作上的需要,寫Java程式去爬網頁,爬回來的網頁要去解析出要用的資料,拜歐發現jsoup這個函式庫非常好用,在這裡簡單介紹一下。

在這裡,拜歐要把Google新聞首頁的標題都爬回來,先找到包含標題的HTML標籤裡,可以辨別的屬性,如:


從上面可以看到要包著標題的是span標籤,而且它有一個名為titletextCSS類別,所以使用jsoup函式,可以這樣做:
package idv.jk.web.parser;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.Iterator;

/**
 * Created by Javakid on 2015/4/14.
 */
public class HtmlParserMain
{
    public static void main(String[] argv)
    {
        String url = "https://news.google.com.tw/news";
        try {
            Document doc = Jsoup.connect(url).get();
            System.out.println(doc.title());
            Elements h1s = doc.select("span.titletext");

            Element thisOne = null;
            for(Iterator it = h1s.iterator(); it.hasNext();)
            {
                thisOne = (Element)it.next();
                System.out.println(thisOne.html());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上面的程式碼中,在第20行先把該網址的網頁內容取回,並且將其封裝成一個org.jsoup.nodes.Document類別的物件。

在第21行呼叫title方法,將該頁的抬頭(title)印出來。

在第22行使用選擇器查詢(selector query)來挑出所要的元素,這裡span.titletext挑選的出來的是class屬性為titletextspan標籤。

撰擇器的語法可以參考這裡,若是熟悉jQuery,一定會覺得一模一樣XD。

然後在第28行把其內含的HTML內容印出來。

結果如下:
Google 新聞
毛揆:尊嚴、公平是加入亞投行最高原則| 聯合影音
入亞投行金額朱立倫:非台灣說了算
加入亞投行毛揆:決定權仍在我方
毛治國:亞投行創始章程無法容納台灣
肺癌躍居10大癌症第二女性患者激增
大腸癌7度居冠子宮頸癌首脫離十大排行
每5分26秒就有1人罹癌大腸癌連7年居首位
十大癌症排行!腸癌7度奪冠最兇猛女性肺癌變多
博科聖地猖狂綁架逾2000女性
被博科聖地擄走50少女據報仍生存
(以下省略)

沒有留言: