【JAVA】使用JSOUP讓JAVA取得網頁上的文字 (Example for download)

一年一度的暑假又到了,正是很多大四的學生即將踏入專題水深火熱的日子。
因為之前參加比賽擺攤的經驗,有很多人都會問關於我們專題是怎麼讓JAVA/Android讀到網頁上的文字,所以我這個無業遊民就來回饋大家了!!
廢話不多說,馬上來說明到底要怎麼使用JSOUP─HTML/XML 解析 取得網頁上的文字!!

關於 JSOUP

它是一個別人寫好的JAVA套件,可以解析HTML及XML,至於是為什麼能做到,
因為HTML和XML有所謂的tag

圖片來自:維基百科

如上圖,就是這個左右大小於括起來的東西,
它能取得指定的tag,一直到下一個結束為止,所以凡是有tag的網頁,JSOUP都能取得tag包夾的資料。
於是乎,我們可以歸納出JSOUP能作的事情有:

  1. 取得HTML網頁的文字(tag若重覆,則取得方法在後面有範例)
  2. 取得XML網頁的文字(因為tag不會有重覆的情況,解析tag會達到最佳效果)
  3. 資料庫的資料(將取得資料庫的php網頁按右鍵檢視原始碼後,會顯示成HTML語言,接下來的方法同HTML)
  4. 若要取得一些每日天氣的情報,可以至中央氣象局的RSS,一樣使用JSOUP解析網頁上的內容
  5. 可以使用在JAVA上,當然也能使用在Android上,但需做一些設定,就能將上述四點都應用至Android app
  6. 想到待補…..

JSOUP 事前工作

  1. 請先至JSOUP官網將JAR檔載下來 http://jsoup.org/download

  2. (載第一個檔案即可,圖的版本為1.7.3)

  3. 將載下來的jar檔放到你的要使用的JAVA Project底下
  4. (這一步可以不做,但如果換電腦的話jar會找不到或jar路徑錯誤)

  5. 開啟撰寫平台(以下圖示範為Eclipse)
    1. 在左邊的專案列表上的Project點右鍵,選擇Properties(如下圖)
    2. 點選Java Build Path,並按下右側的Add External JARs選擇你剛剛載的jsoup.jar檔案的路徑
    3. (這一步如果在換電腦寫程式時,路徑會跑掉,得重新再做一次)

    4. 加入後會長下面那個樣子,這樣就表示可以開始使用JSOUP了

JSOUP簡單範例程式及說明

下面將以簡單的html網頁作為範例解說:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>今天你好嗎?</title>
</head>
<body>
	<table>
		<tr><td>喜</td><td>樂</td></tr>
		<tr><td>怒</td><td>哀</td></tr>
	</table>
</body>
</html>

這是一個有table的HTML網頁,其顯示結果為

就….長這個樣子而已XD
接下來我打算解析這個網頁的標題以及table中的第二個值

JAVA程式碼如下:

import java.net.URL;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.parser.Parser;
import org.jsoup.select.Elements;


public class main {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
			Parsing();
	}
	public static void Parsing() throws Exception {
		URL url = new URL(&amp;amp;amp;amp;amp;amp;amp;quot;http://在這邊輸入你要解析的網頁網址&amp;amp;amp;amp;amp;amp;amp;quot;); 
		Document xmlDoc =  Jsoup.parse(url, 3000); //使用Jsoup jar 去解析網頁
		//(要解析的文件,timeout)
		Elements title = xmlDoc.select(&amp;amp;amp;amp;amp;amp;amp;quot;title&amp;amp;amp;amp;amp;amp;amp;quot;); //要解析的tag元素為title
		Elements happy = xmlDoc.select(&amp;amp;amp;amp;amp;amp;amp;quot;td&amp;amp;amp;amp;amp;amp;amp;quot;);  //要解析的tag元素為td
			
		System.out.println("Title is "+title.get(0).text()); //得到title tag的內容
		System.out.println("you select mood is "+happy.get(1).text()); //得到td tag的內容
		//注意: 因為有好多個td 我想要取得的是<td>樂</td> 是第2個td 所以填get(1)

	}

}

註解已打在程式碼上,值得注意的地方是在取得

的時候,因為有好多個

→ happy.get(0).text

→ happy.get(1).text

→ happy.get(2).text

→ happy.get(3).text

以這種方式來識別是要解析哪一個 td


在上面的關於JSOUP中有提到Android也可以使用這個方式,除了將程式碼改為Android程式碼以外,還要在Android Project的AndroidManifest.xml中調整成以下程式碼:

<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>

進行改版本以及開啟網路權限

Android的程式碼我就不提供了(電腦跑Android模擬器很慢+沒有Android手持裝置),就當作業自己改吧XD
另外就是加入jsoup.jar檔時,可以加在Android Project的libs資料夾底下

像這樣。

JSOUP測試檔案(JAVA+網頁)下載處


2015/03/24 更新
因為很多人都問Android的部分,我寫了一個簡單的範例(有符合OOP吧….),
把要解析的網址換成你要的url應該就能執行,
記得要是純html、php或xml,其他的貌似解析不良XD

JSOUP測試檔案(Android)下載處


2015/06/23 更新
因為很多人問了一些不錯的問題是我當年還小(?)的時候沒有想過的,
現在長大知道有些好用的解析技巧,應該要補充上來讓大家參考一下
【Android】JSOUP 補充 ─ 支援正規表示法
【Android】JSOUP 補充 ─ 取得標籤中的網址 (文末提供範例下載)

更多補充還在平行時空裡^q^…..

Advertisements

One thought on “【JAVA】使用JSOUP讓JAVA取得網頁上的文字 (Example for download)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s