詳解Java爬蟲利器Jsoup
Jsoup的概述
Jsoup是一款Java語言開發(fā)的HTML解析器,用于解析HTML文檔以及對HTML文檔進(jìn)行操作,處理等。它提供了類似于jQuery的DOM操作方法,以及用于HTML元素遍歷、迭代、查詢以及修改等操作的API,同時還支持CSS選擇器和正則表達(dá)式的解析。
Jsoup的特點
- 可以從URL中直接獲取網(wǎng)頁的內(nèi)容并進(jìn)行解析。
- 支持CSS選擇器和正則表達(dá)式。
- 采用DOM結(jié)構(gòu),直觀簡單。
- 支持流暢的鏈?zhǔn)讲僮黠L(fēng)格。
- 支持屬性查找和修改。
- 支持XML解析。
Jsoup的優(yōu)點
- 簡單、方便、易學(xué)易用。
- Jsoup的相對性能比較高,特別是在處理大型HTML文件時。
- 支持CSS選擇器及正則表達(dá)式等復(fù)雜操作。
- Jsoup對HTML進(jìn)行清理,可以特別有效地防止XSS腳本攻擊。
- 能夠與Java內(nèi)部的文檔模型(DOM)結(jié)合,符合Java的運(yùn)行環(huán)境。
Jsoup的核心類
以下是Jsoup中最重要的幾個核心類:
- Document:代表整個HTML或XML文檔??梢酝ㄟ^該類來獲取所需的元素、屬性等。
- Element:代表HTML中的一個元素。例如, ,
等。
- Elements:代表多個元素組成的集合,即一個數(shù)組。
- Node:代表一個節(jié)點,可以是文本、注釋或者其他類型的節(jié)點。
- TextNode:代表文本節(jié)點,主要用于獲取標(biāo)簽之間的文本內(nèi)容。
- Attribute:代表HTML元素中的屬性。
Jsoup的用法
這里我將從以下方面介紹Jsoup的用法:
1.導(dǎo)入Jsoup到項目中
在使用Jsoup前,需要將它添加到項目的依賴中。如果使用Maven,只需要在pom.xml文件中添加下面的代碼即可:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version>
</dependency>2.解析HTML文檔
解析HTML的第一步是將HTML文檔加載到Jsoup的Document對象中,以便進(jìn)行后續(xù)操作。可以通過以下方式實現(xiàn):
String html = "<html><head><title>Jsoup Example</title></head>"
+ "<body><p>Hello world!</p></body></html>";
Document doc = Jsoup.parse(html);其中,Jsoup.parse(html)可以將字符串轉(zhuǎn)換為Document對象,而html則是需要解析的HTML。
3.從URL加載HTML
除了直接解析HTML字符串,Jsoup還支持從URL地址獲取HTML內(nèi)容并進(jìn)行解析??梢允褂靡韵麓a:
String url = "http://www.example.com/"; Document doc = Jsoup.connect(url).get();
其中,Jsoup.connect(url).get()可以從指定的url地址獲取HTML內(nèi)容并解析成Document對象。
4.使用選擇器查找元素
Jsoup支持類似于jQuery的CSS選擇器語法,可以用非常簡單的方式查找HTML元素。例如,查找所有的p標(biāo)簽,可以使用如下代碼:
Elements paragraphs = doc.select("p");select()方法會返回匹配選擇器的元素的集合。
更進(jìn)一步來說,選擇器可以根據(jù)標(biāo)簽名、屬性、樣式等多種條件篩選元素。例如,以下代碼會查找所有帶有href屬性的鏈接:
Elements links = doc.select("a[href]");如果要查找指定class的元素,可以使用類似于CSS的“.classname”語法:
Elements elementsByClass = doc.select(".classname");同樣地,也支持按屬性值進(jìn)行查找:
Elements links = doc.select("a[href=\"#\"]");這些選擇器可以非常靈活地精準(zhǔn)定位到需要的HTML元素。
5.獲取元素的屬性和內(nèi)容
在定位到所需的HTML元素后,可以使用Jsoup提供的方法獲取元素的屬性和內(nèi)容。例如,以下代碼可以獲取a標(biāo)簽的href屬性和顯示的文本內(nèi)容:
Element link = doc.select("a").first();
String href = link.attr("href");
String text = link.text();attr()方法可以獲取指定屬性的值,而text()方法可以獲取標(biāo)簽之間的文本內(nèi)容。
6.修改HTML文檔
Jsoup不僅可以解析HTML文檔,還可以修改文檔中的元素、屬性等內(nèi)容??梢允褂靡韵麓a:
Element link = doc.select("a").first();
link.attr("href", "http://www.newsite.com/");
link.text("New Site");這些方法可以非常方便地修改HTML文檔中的元素和屬性。
7.處理HTML中的正文
有時候我們只需要解析HTML中的正文部分而不是全文,這種情況下可以使用Jsoup提供的方法實現(xiàn)。例如,以下代碼可以提取HTML中的所有正文段落:
Document doc = Jsoup.parse(html);
Elements paragraphs = doc.select("p");
String text = paragraphs.text();上面代碼中,Jsoup首先解析HTML文檔并查找所有的p標(biāo)簽,然后使用text()方法提取正文內(nèi)容。
Jsoup的高級用法
了解了基本用法后,我們可以進(jìn)一步了解Jsoup的高級用法,例如:
1.從HTML中提取圖片
可以使用以下代碼提取出HTML文檔中的所有圖片:
Document doc = Jsoup.connect(url).get();
Elements images = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]");這里的正則表達(dá)式可以過濾掉非圖片類型的元素。
2.從HTML中提取所有鏈接
可以使用以下代碼提取出HTML中的所有鏈接:
Document doc = Jsoup.connect(url).get();
Elements links = doc.select("a[href]");然后遍歷links集合,即可獲取每個鏈接的href屬性和文本內(nèi)容。
3.自定義User-Agent和超時時間
可以通過以下方式指定Jsoup連接的User-Agent和超時時間:
String url = "http://www.example.com/";
Connection conn = Jsoup.connect(url);
conn.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0");
conn.timeout(5000);
Document doc = conn.get();其中userAgent()方法可以設(shè)置User-Agent,timeout()方法可以設(shè)置超時時間,單位是毫秒。
4.處理HTML中的中文編碼問題
當(dāng)解析包含中文字符的HTML文檔時,可能會出現(xiàn)亂碼等問題??梢酝ㄟ^以下方式解決:
Document doc = Jsoup.parse(html, "UTF-8"); String title = doc.title(); String text = doc.text();
這里的"UTF-8"指定了HTML文檔的字符集,以解決編碼問題。
5.處理HTML中的表格
可以使用以下代碼提取表格中的數(shù)據(jù):
Document doc = Jsoup.connect(url).get();
Elements tableRows = doc.select("table tr");
for (Element row : tableRows) {
Elements cells = row.select("td");
for (Element cell : cells) {
String cellText = cell.text();
}
}這里先通過選擇器查找所有的tr標(biāo)簽,然后對每個tr標(biāo)簽內(nèi)的td標(biāo)簽進(jìn)行遍歷,獲取單元格的內(nèi)容。
6.處理HTML中的特殊字符
有些HTML文檔中包含特殊字符,例如©、™等符號,這些符號可能會導(dǎo)致解析錯誤??梢允褂靡韵路绞浇鉀Q:
Document doc = Jsoup.parse(html); doc.outputSettings().escapeMode(EscapeMode.base); String text = doc.text();
這里的escapeMode()方法可以指定轉(zhuǎn)義字符的模式,base模式表示只轉(zhuǎn)義基本的字符,其他的字符不做轉(zhuǎn)義。
7.使用代理連接網(wǎng)站
有些網(wǎng)站可能會禁止爬蟲訪問,可以使用代理服務(wù)器連接到網(wǎng)站??梢允褂靡韵麓a設(shè)置代理:
String url = "http://www.example.com/";
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxyhost", 8080));
Connection conn = Jsoup.connect(url).proxy(proxy);
Document doc = conn.get();其中proxy()方法可以設(shè)置代理服務(wù)器的地址和端口號。
8.處理HTML中的連接
可以使用以下代碼將相對路徑轉(zhuǎn)換為絕對路徑:
String url = "http://www.example.com/";
Document doc = Jsoup.connect(url).get();
Elements links = doc.select("a[href]");
for (Element link : links) {
String absLink = link.attr("abs:href");
}這里的abs()方法可以將相對路徑轉(zhuǎn)換為絕對路徑,從而能夠正確地訪問鏈接。
9.使用Jsoup處理XML
除了HTML,Jsoup還能夠處理XML文檔??梢允褂靡韵麓a解析XML文檔:
String xml = "<root><item>1</item><item>2</item><item>3</item></root>";
Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
Elements items = doc.select("item");這里的xmlParser()方法將Jsoup的解析器設(shè)置為XML模式,然后就可以使用CSS選擇器查找XML元素了。
10.處理HTML中的圖片
有時候我們需要將HTML中的圖片下載到本地使用??梢允褂靡韵麓a實現(xiàn):
String imageUrl = "http://www.example.com/image.jpg"; Connection.Response resultImageResponse = Jsoup.connect(imageUrl).ignoreContentType(true).maxBodySize(0).execute(); byte[] imageBytes = resultImageResponse.bodyAsBytes();
這里的ignoreContentType()方法可以忽略ContentType的檢查,maxBodySize()方法可以設(shè)置請求的最大字節(jié)數(shù)。然后可以將結(jié)果寫入文件或者流中,以保存圖片內(nèi)容。
以上就是詳解Java爬蟲利器Jsoup的用法的詳細(xì)內(nèi)容,更多關(guān)于Java爬蟲利器Jsoup的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Hibernate4執(zhí)行save()或update()無效問題的方法
這篇文章主要為大家詳細(xì)介紹了解決Hibernate4執(zhí)行save()或update()無效問題的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-06-06
Java編程實現(xiàn)的二維數(shù)組轉(zhuǎn)置功能示例
這篇文章主要介紹了Java編程實現(xiàn)的二維數(shù)組轉(zhuǎn)置功能,結(jié)合實例形式分析了Java二維數(shù)組的遍歷、運(yùn)算、賦值等實現(xiàn)轉(zhuǎn)置的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Java?ConcurrentHashMap實現(xiàn)線程安全的代碼示例
眾所周知ConcurrentHashMap是HashMap的多線程版本,HashMap?在并發(fā)操作時會有各種問題,而這些問題,只要使用ConcurrentHashMap就可以完美解決了,本文將給詳細(xì)介紹ConcurrentHashMap是如何保證線程安全的2023-05-05
Springboot中如何使用Redisson實現(xiàn)分布式鎖淺析
redisson是redis的java客戶端程序,國內(nèi)外很多公司都有在用,下面這篇文章主要給大家介紹了關(guān)于Springboot中如何使用Redisson實現(xiàn)分布式鎖的相關(guān)資料,需要的朋友可以參考下2021-10-10
SpringCloud?微服務(wù)數(shù)據(jù)權(quán)限控制的實現(xiàn)
這篇文章主要介紹的是權(quán)限控制的數(shù)據(jù)權(quán)限層面,意思是控制可訪問數(shù)據(jù)資源的數(shù)量,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-11-11
利用HttpUrlConnection 上傳 接收文件的實現(xiàn)方法
下面小編就為大家?guī)硪黄肏ttpUrlConnection 上傳 接收文件的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
SpringBoot+SpringCloud用戶信息微服務(wù)傳遞實現(xiàn)解析
這篇文章主要介紹了SpringBoot+SpringCloud實現(xiàn)登錄用戶信息在微服務(wù)之間的傳遞,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11

