Java爬蟲框架Jsoup學習記錄
Jsoup的作用
當你想獲得某網頁的內容,可以使用此框架做個爬蟲程式,爬某圖片網站的圖片(先獲得圖片地址,之後再借助其他工具下載圖片)或者是小說網站的小說內容
我使用Jsoup寫出的一款小說下載器,小說下載器
Jsoup匯入
1. 使用gradle匯入
compile 'org.jsoup:jsoup:1.11.1'
2. 第三方包匯入
Jsoup使用
1. 獲得Document
- 本地html檔案或者使用javaIO流,則使用靜態方法`parse`方法 ``` Document document = Jsoup.parse("D:\\test.html"); ``` - 網址的話使用靜態方法`connect().get()` ``` Document document = Jsoup.connect("https://www.baidu.com").get(); ```
2. 根據id找到某標籤 document.getElementById
因為id
是唯一的,所以找到唯一的一個Element
Element element = document.getElementById("id名");
3. 根據class找到某標籤 document.getElementsByClass
class可能不止一個,所以這裡返回的是一個Elemnts
陣列
Elements elements = document.getElementsByClass("d_title").select("h1");
4. 獲得標籤的內容 element.text()
例如html檔案中有段程式碼為
<a id="title">hello world</a>
獲得a標籤的內容的程式碼為
Element element = document.getElementById("title"); String s = element.text();
5. 獲得標籤的屬性 element.attr()
有段程式碼如下:
<a id="main" href="www.baidu.com"></a>
獲得a標籤的連結地址
Element element = document.getElementById("main"); String url = element.attr String s = element.text();
6. 選擇固定標籤(li,p,a等)element.select("a")
返回的是Elements
陣列
例如html檔案中有段程式碼為
<div id="main"><a>hello world!</a></div>
獲得a標籤的內容程式碼為
Element element = document.getElementById("main"); Elements elements = element.select("a"); for(int i=0;i<elements.size();i++){ String s = elements.get(i).text(); }
獲取p標籤不能換行
有段程式碼
<div id="main"> <p>hello world</p> <p>this is my name</p> </div>
我們由id找到了element,我們想要獲得p標籤的內容,怎麼辦呢?
剛開始我想的也是使用select方法來選擇p標籤,但是,沒有其作用
正確的方法應該是使用element.text方法獲得內容,但是獲得的內容全是一行的(段落之間是用空格隔開的)
我們想要每個p標籤的內容獨佔一行,怎麼辦呢?
我們直接把空格替換成\n
即可
String string = element.text().replaceAll(" ","\n");
另外一種方法,如果感覺上面的方法不好用的話(有些小說原本就有些多餘的空格),那麼就使用下面的方法
Element element = document.getElementById("main"); String text = Jsoup.clean(element.html(), "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));//儲存p標籤換行
上面的獲得的內容還有 
標誌(html的空格標誌),我們還得刪除這個標誌以及多餘的空行
/** * 處理空行和“ ”標誌 * @param input 內容 * @return 處理過後的結果 */ public static String deleteCRLFOnce(String input) { return input.replaceAll("((\r\n)|\n)[\\s\t ]*(\\1)+", "$1").replaceAll(" ", ""); }