《Android》『Jsoup』- 如何使用 Jsoup 取得 HTML 網頁上的資訊
《參考文獻》
《簡單介紹》
Jsoup 在官網上的名稱叫做 Java HTML Parser,照字面翻譯,它是一個 Java 現成的 API 套件,用來幫助我們解析 HTML 與 XML 的資訊,透過 Jsoup,我們可以取得 HTML 與 XML 中所指定的不同名稱的標籤,以及標籤裡面的內容,而現在大部分的網頁都是由 HTML 所組成的,因此學會如何使用 Jsoup,對於在 Android 中有需要取得網頁資訊時,會相當方便。
《程式範例》
在 HTML 格式中,標籤並不一定是完全對稱的,且同樣名字的標籤常常會有重複,其中很多標籤是用來畫出網頁的架構,這些介面資訊的標籤並不是我們想要取得的網頁資訊,通常我們要找有用的資訊,會從 <table>、<th>、<tr>、<td>這幾組標籤名稱去尋找,若是 XML 格式,則標籤可以自行定義名稱,找到我們所需要的資訊以後,才會知道篩選條件要怎麼下,接著再著手撰寫程式去操作。(<th> : table head、<tr> : table row、<td> : table data)
這邊我們直接以程式碼範例做說明,首先先建立一個 .html 格式的檔案,內容如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<html> <head> ... <style>...</style> </head> <body bgcolor="#EEEEEE"> <table> <tr> <th>Name</th> <th>Age</th> <th>Gender</th> </tr> <tr> <td><a herf="https://xnfood.com.tw">Xavier</td> <td>18</td> <td>male</td> </tr> <tr> <td><a herf="https://xnfood.com.tw">Nina</td> <td>20</td> <td>female</td> </tr> </table> </body> </html> |
data.html
在這個 .html 格式的網頁裡面,包含了一個表格,裡面有三列資訊,分別記錄著名字、年齡以及性別,接著,我們再利用程式碼去取得此檔案並解析 html 格式內所包含的資訊。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
package ... import ... public class main { public final static String URL = "http://要解析的網頁網址"; public static void main(String[] args) throws Exception { //讀取 data.html 資料(Local) ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream is = classLoader.getResourceAsStream("res/data.html"); Document data = Jsoup.parse(is, "UTF-8", ""); //讀取特定網址的 html 格式 URL url = new URL("http://要解析的網頁網址"); try { Connection.Response response = Jsoup.connect(URL).execute(); String body = response.body(); //只讀取 <body> 標籤的部分 Document data = Jsoup.parse(body); } catch(IOException e) {System.out.println(e.toString());} //解析所有 <tr> 標籤 Element trs = data.select("tr"); System.out.println("trs.toString(): \n" + trs.toString() + "\n"); for(Element tr : trs) { System.out.println(tr.text() + ", "); } //解析所有 <th> 標籤 Elements ths = trs.select("th"); System.out.println(ths.toString(): \n" + ths.toString() + "\n"); for(Element th : ths) { System.out.println(th.text() + ", "); } //直接解析 <tr> 標籤中的 <th> 標籤 Element ths2 = data.select("tr > th"); System.out.println(ths2.toString(): \n" + ths2 .toString() + "\n"); for(Element th : ths2) { System.out.println(th.text() + ", "); } //透過取得 <tr> 標籤節點,利用索引的方式取裡面標籤 <th> 包含的值 List<Student> studentList = new ArrayList<Student>(); for(int i = 1; i < trs.size(); i++) { Elements tds = trs.get(i).select("td"); String link = tds.get(0).select("a").attr("href"); //取得標籤屬性中的值的方法 String name = tds.get(0).text(); double price = Double.parseDouble(tds.get(1).text()); String author = tds.get(2).text(); Student student = new Student(name, price, author, link); studentList.add(student); } } ... } |
main.java
其中 .select() 方法用來取得傳入的標籤名稱節點,取得節點以後可以用 .toString() 方法將此結構完整的顯示出來,或者是用 .text() 方法單純將標籤節點中的值取出來,而記錄在標籤屬性中的值(此例來說為網址),亦可以用相同的方式取出,在這個範例的最後,我們宣告了一個 Student 類別,並將解析出來的資訊,用一個迴圈依序存成一個 student 物件的 List 清單,所用到的 Student 類別宣告片段如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package... public class Student { private String name; private double age; private String link; private String gender; public Student(String name, double age, String link, String gender) { this.name = name; this.age= age; this.link= link; this.gender= gender; } ... } |
Student.java
臉書留言
一般留言