詳解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的運行環(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中的圖片下載到本地使用。可以使用以下代碼實現(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)文章
Java數(shù)組的定義、初始化、及二維數(shù)組用法分析
這篇文章主要介紹了Java數(shù)組的定義、初始化、及二維數(shù)組用法,結(jié)合具體實例形式分析了java數(shù)組概念、功能、數(shù)組定義、靜態(tài)數(shù)組、動態(tài)數(shù)組、二維數(shù)組等相關(guān)使用技巧,需要的朋友可以參考下2019-01-01