You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jsoup从在线网站获取元素类/ID及数据并解析至本地HTML

嘿,这两个Jsoup的需求我太熟了,日常做页面迁移、数据同步经常用到,咱们一步步拆解来做!

问题1:如何使用Jsoup从在线网站获取任意元素的class/id并应用到本地网站?

首先得确保你的项目里引入了Jsoup依赖,Maven和Gradle的配置我给你贴出来:

<!-- Maven 依赖 -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.17.2</version> <!-- 建议用最新稳定版 -->
</dependency>
// Gradle 依赖
implementation 'org.jsoup:jsoup:1.17.2'

接下来分三步操作:

  • 抓取目标在线页面:用Jsoup的connect()方法获取目标网站的文档对象,记得处理网络异常,还可以加user-agent模拟浏览器避免被反爬拦截:
String targetUrl = "https://example.com"; // 替换成你要抓取的网站
Document onlineDoc = null;
try {
    onlineDoc = Jsoup.connect(targetUrl)
                     .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
                     .get();
} catch (IOException e) {
    e.printStackTrace();
    System.err.println("抓取在线页面失败:" + e.getMessage());
}
  • 定位并提取目标元素的class/id:用CSS选择器定位你要的元素,和前端选元素的语法一模一样,比如抓id为main-header的元素:
if (onlineDoc != null) {
    Element targetElement = onlineDoc.selectFirst("#main-header");
    if (targetElement != null) {
        String elementClass = targetElement.attr("class");
        String elementId = targetElement.attr("id");
        System.out.println("提取到的class: " + elementClass);
        System.out.println("提取到的id: " + elementId);
    }
}
  • 将class/id应用到本地网站元素:加载你的本地HTML文件,找到要修改的元素,把提取到的属性赋值过去,最后保存修改:
if (onlineDoc != null) {
    Element targetElement = onlineDoc.selectFirst("#main-header");
    if (targetElement != null) {
        try {
            // 加载本地HTML文件
            File localHtml = new File("你的本地HTML文件路径/page.html");
            Document localDoc = Jsoup.parse(localHtml, "UTF-8");
            
            // 定位本地要修改的元素,比如本地的header标签
            Element localHeader = localDoc.selectFirst("header");
            if (localHeader != null) {
                // 覆盖原有class,也可以用addClass()追加
                localHeader.attr("class", targetElement.attr("class"));
                // 设置id
                localHeader.attr("id", targetElement.attr("id"));
                
                // 把修改后的内容写回本地文件
                try (FileWriter writer = new FileWriter(localHtml)) {
                    writer.write(localDoc.outerHtml());
                    System.out.println("本地元素属性修改完成!");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
问题2:如何使用Jsoup从互联网上的在线网站获取任意元素的数据并解析到本地HTML中?

这个需求核心是提取在线元素的内容(文本、HTML结构、属性值等),再插入到本地页面,步骤和上面类似,但重点在数据提取和插入:

  • 抓取并定位在线元素:和问题1一样,先拿到在线页面的文档,再定位要提取数据的元素:
String postUrl = "https://example.com/blog/2024-post"; // 替换成目标文章URL
Document postDoc = null;
try {
    postDoc = Jsoup.connect(postUrl)
                   .userAgent("Mozilla/5.0")
                   .get();
} catch (IOException e) {
    e.printStackTrace();
}
  • 提取元素数据:根据需求选择提取文本(text())还是带格式的HTML(html()),或者属性值:
if (postDoc != null) {
    // 提取文章标题(纯文本)
    Element postTitle = postDoc.selectFirst("h1.post-title");
    String title = postTitle != null ? postTitle.text() : "未获取到标题";
    
    // 提取文章内容(保留HTML格式)
    Element postContent = postDoc.selectFirst("div.post-body");
    String content = postContent != null ? postContent.html() : "暂无内容";
    
    // 示例:提取文章封面图的src属性
    Element coverImg = postDoc.selectFirst("img.post-cover");
    String coverSrc = coverImg != null ? coverImg.attr("src") : "";
}
  • 将解析后的数据插入本地HTML:加载本地模板,找到插入位置,把数据放进去,也可以直接创建新元素添加:
if (postDoc != null) {
    Element postTitle = postDoc.selectFirst("h1.post-title");
    Element postContent = postDoc.selectFirst("div.post-body");
    if (postTitle != null && postContent != null) {
        try {
            // 加载本地模板HTML
            File localTemplate = new File("你的模板路径/template.html");
            Document localDoc = Jsoup.parse(localTemplate, "UTF-8");
            
            // 替换本地模板的标题占位符
            Element localTitle = localDoc.selectFirst(".local-title");
            if (localTitle != null) {
                localTitle.text(postTitle.text());
            }
            
            // 插入文章内容到本地页面
            Element localContentArea = localDoc.selectFirst(".local-content");
            if (localContentArea != null) {
                localContentArea.html(postContent.html());
            }
            
            // 额外:如果要添加封面图,创建img元素插入
            Element coverImg = postDoc.selectFirst("img.post-cover");
            if (coverImg != null) {
                Element newImg = localDoc.createElement("img");
                newImg.attr("src", coverImg.attr("src"));
                newImg.attr("alt", postTitle.text());
                localContentArea.before(newImg); // 把图片插在内容前面
            }
            
            // 保存最终的本地HTML
            try (FileWriter writer = new FileWriter(new File("输出路径/result.html"))) {
                writer.write(localDoc.outerHtml());
                System.out.println("数据解析插入完成!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

一些实用小提醒

  • 一定要遵守目标网站的robots.txt规则,不要频繁请求,避免被封IP,可以加个Thread.sleep(1000)延迟请求。
  • 所有元素操作前都要做非空判断,不然很容易触发空指针异常。
  • 如果目标网站有反爬(比如需要登录、验证码),可能需要额外处理Cookie、请求头,甚至模拟登录流程,这时候可以用Jsoup的cookie()方法设置登录后的Cookie。

内容的提问来源于stack exchange,提问作者Hidung Pesek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:13:26