Java爬蟲框架Jsoup學習記錄


Jsoup的作用

當你想獲得某網頁的內容,可以使用此框架做個爬蟲程序,爬某圖片網站的圖片(先獲得圖片地址,之后再借助其他工具下載圖片)或者是小說網站的小說內容

我使用Jsoup寫出的一款小說下載器,小說下載器

Jsoup導入

Jsoup官網

1. 使用gradle導入

compile 'org.jsoup:jsoup:1.11.1'

2. 第三方包導入

Jsoup使用

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標簽換行

上面的獲得的內容還有&nbsp標志(html的空格標志),我們還得刪除這個標志以及多余的空行

	/**
     * 處理空行和“&nbsp;”標志
     * @param input 內容
     * @return 處理過后的結果
     */
    public static String deleteCRLFOnce(String input) {
        return input.replaceAll("((\r\n)|\n)[\\s\t ]*(\\1)+", "$1").replaceAll("&nbsp;", "");
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM