欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java爬蟲利器Jsoup

 更新時間:2023年06月16日 08:39:45   作者:蜀山劍客李沐白  
Jsoup是一款Java語言開發(fā)的HTML解析器,用于解析HTML文檔以及對HTML文檔進(jìn)行操作,處理等,本文就將詳細(xì)給大家介紹一下Java中的爬蟲利器Jsoup,感興趣的同學(xué)可以參考一下

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創(chuàng)建表格實例詳解

    Java創(chuàng)建表格實例詳解

    這篇文章主要介紹了Java創(chuàng)建表格實例詳解,需要的朋友可以參考下。
    2017-09-09
  • java Long==Long有趣的現(xiàn)象詳解

    java Long==Long有趣的現(xiàn)象詳解

    這篇文章主要給大家介紹了關(guān)于java Long==Long有趣的現(xiàn)象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 一文帶你秒懂Java為什么只有值傳遞

    一文帶你秒懂Java為什么只有值傳遞

    值傳遞是指在調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中,引用傳遞是指在調(diào)用函數(shù)時將實際參數(shù)的引用直接傳遞到函數(shù)中,本文將詳細(xì)介紹Java中值傳遞的相關(guān)知識,感興趣的可以了解下
    2024-11-11
  • Java數(shù)組的定義、初始化、及二維數(shù)組用法分析

    Java數(shù)組的定義、初始化、及二維數(shù)組用法分析

    這篇文章主要介紹了Java數(shù)組的定義、初始化、及二維數(shù)組用法,結(jié)合具體實例形式分析了java數(shù)組概念、功能、數(shù)組定義、靜態(tài)數(shù)組、動態(tài)數(shù)組、二維數(shù)組等相關(guān)使用技巧,需要的朋友可以參考下
    2019-01-01
  • Java淺析枚舉類的使用

    Java淺析枚舉類的使用

    枚舉類型可以取代以往常量的定義方式,即將常量封裝在類或接口中。此外,枚舉類型還提供了安全檢查功能。本文就來和大家講講Java中枚舉類的用法,需要的可以參考一下
    2022-07-07
  • Spring通過Java配置集成Tomcat的方法

    Spring通過Java配置集成Tomcat的方法

    這篇文章主要介紹了Spring通過Java配置集成Tomcat的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java socket通訊實現(xiàn)過程及問題解決

    Java socket通訊實現(xiàn)過程及問題解決

    這篇文章主要介紹了Java socket通訊實現(xiàn)過程及問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Java中流的有關(guān)知識點詳解

    Java中流的有關(guān)知識點詳解

    今天小編就為大家分享一篇關(guān)于Java中流的有關(guān)知識點詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java后端面試題最新整理

    Java后端面試題最新整理

    在本篇文章里小編給大家整理了一篇關(guān)于Java后端面試題最新整理內(nèi)容,需要的朋友們可以參考下。
    2020-12-12
  • 深入理解Java原生的序列化機(jī)制

    深入理解Java原生的序列化機(jī)制

    Java 提供了一種對象序列化的機(jī)制,該機(jī)制中,一個對象可以被表示為一個字節(jié)序列,該字節(jié)序列包括該對象的數(shù)據(jù)、有關(guān)對象的類型的信息和存儲在對象中數(shù)據(jù)的類型。下面小編和大家來一起學(xué)習(xí)一下吧
    2019-06-06

最新評論