Jsoup库怎么用?

Jsoup 是一个非常强大的 Java 库,用于解析 HTML 文档并提取数据。它提供了简洁的 API 和灵活的选择器语法,使得解析 HTML 变得非常方便。以下是一些常见的使用方法和示例代码,帮助你快速上手 Jsoup

一、Jsoup 的基本用法

(一)解析 HTML 文档

Jsoup 可以解析字符串形式的 HTML,也可以直接从 URL 或文件中加载 HTML 文档。

1. 从字符串解析 HTML

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><head><title>Test</title></head><body><p>Hello, Jsoup!</p></body></html>";
        Document doc = Jsoup.parse(html);
        System.out.println(doc.title()); // 输出:Test
    }
}
2. 从 URL 加载 HTML

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsoupExample {
    public static void main(String[] args) {
        try {
            Document doc = Jsoup.connect("https://example.com").get();
            System.out.println(doc.title()); // 输出页面标题
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(二)选择器语法

Jsoup 提供了类似 CSS 的选择器语法,可以非常方便地选择特定的 HTML 元素。

1. 按标签选择

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><p>Hello, Jsoup!</p><a href='https://example.com'>Link</a></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select("p");
        for (Element paragraph : paragraphs) {
            System.out.println(paragraph.text()); // 输出:Hello, Jsoup!
        }
    }
}
2. 按类选择

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><div class='content'>Content</div></body></html>";
        Document doc = Jsoup.parse(html);
        Elements contents = doc.select("div.content");
        for (Element content : contents) {
            System.out.println(content.text()); // 输出:Content
        }
    }
}
3. 按 ID 选择

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><div id='main'>Main Content</div></body></html>";
        Document doc = Jsoup.parse(html);
        Element mainContent = doc.select("#main").first();
        System.out.println(mainContent.text()); // 输出:Main Content
    }
}
4. 组合选择器

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><div class='content'><p>Hello, Jsoup!</p></div></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select("div.content > p");
        for (Element paragraph : paragraphs) {
            System.out.println(paragraph.text()); // 输出:Hello, Jsoup!
        }
    }
}

(三)提取元素内容

Jsoup 提供了多种方法来提取元素的内容,包括文本、属性和 HTML。

1. 提取文本

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><p>Hello, Jsoup!</p></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select("p");
        for (Element paragraph : paragraphs) {
            System.out.println(paragraph.text()); // 输出:Hello, Jsoup!
        }
    }
}
2. 提取属性

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><a href='https://example.com'>Link</a></body></html>";
        Document doc = Jsoup.parse(html);
        Elements links = doc.select("a");
        for (Element link : links) {
            System.out.println(link.attr("href")); // 输出:https://example.com
        }
    }
}
3. 提取 HTML

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><div><p>Hello, Jsoup!</p></div></body></html>";
        Document doc = Jsoup.parse(html);
        Elements divs = doc.select("div");
        for (Element div : divs) {
            System.out.println(div.html()); // 输出:<p>Hello, Jsoup!</p>
        }
    }
}

(四)遍历元素

可以使用 forEachfor 循环来遍历选择的元素集合。

1. 使用 forEach

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><p>Hello, Jsoup!</p><p>Another paragraph.</p></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select("p");
        paragraphs.forEach(paragraph -> {
            System.out.println(paragraph.text());
        });
    }
}
2. 使用 for 循环

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><p>Hello, Jsoup!</p><p>Another paragraph.</p></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select("p");
        for (Element paragraph : paragraphs) {
            System.out.println(paragraph.text());
        }
    }
}

(五)处理相对 URL

在解析 HTML 时,经常会遇到相对 URL。Jsoup 提供了方法将相对 URL 转换为绝对 URL。

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        String html = "<html><body><a href='/path/to/resource'>Link</a></body></html>";
        Document doc = Jsoup.parse(html, "https://example.com");
        Elements links = doc.select("a");
        for (Element link : links) {
            System.out.println(link.absUrl("href")); // 输出:https://example.com/path/to/resource
        }
    }
}

二、完整示例:解析 1688 商品详情

以下是一个完整的示例,展示如何使用 Jsoup 解析 1688 商品详情页的内容。

java

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class AlibabaCrawler {
    public static void main(String[] args) {
        String url = "https://detail.1688.com/offer/123456789.html";
        try {
            Document doc = Jsoup.connect(url).get();
            System.out.println("商品标题: " + doc.title());
            Elements productInfo = doc.select("div.product-info");
            for (Element info : productInfo) {
                System.out.println("商品名称: " + info.select("h1").text());
                System.out.println("商品价格: " + info.select("span.price").text());
                System.out.println("商品描述: " + info.select("div.description").text());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、注意事项和建议

(一)遵守网站规则

在爬取数据时,务必遵守 1688 的 robots.txt 文件规定和使用条款,不要频繁发送请求,以免对网站造成负担或被封禁。

(二)处理异常情况

在编写爬虫程序时,要考虑到可能出现的异常情况,如请求失败、页面结构变化等。可以通过捕获异常和设置重试机制来提高程序的稳定性。

(三)数据存储

获取到的商品信息可以存储到文件或数据库中,以便后续分析和使用。

(四)合理设置请求频率

避免高频率请求,合理设置请求间隔时间,例如每次请求间隔几秒到几十秒,以降低被封禁的风险。

四、总结

通过上述步骤和示例代码,你可以轻松地使用 Jsoup 解析 HTML 文档并提取所需的数据。Jsoup 提供了简洁的 API 和灵活的选择器语法,使得解析 HTML 变得非常方便。希望这个教程对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值