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

Jsoup html.select()无法捕获部分页面<h3>标签问题求助

问题分析

你遇到的核心问题是页面内容的动态渲染差异:

  • 第一个URL的H3标签是服务器直接返回的静态HTML内容,Jsoup可以直接抓取到;
  • 第二个URL的H3标签是通过JavaScript动态生成或加载的,Jsoup作为静态HTML解析库,不会执行页面中的JS代码,所以只能拿到服务器返回的原始静态HTML,自然抓不到动态生成的H3。

浏览器的“页面源码”显示的是服务器返回的原始HTML,而“检查元素”显示的是浏览器执行JS后渲染完成的DOM结构,这就是为什么你在源码里看不到H3,但检查元素能看到的原因。

解决方案

要抓取动态渲染的内容,需要使用能执行JavaScript的工具,以下是两种可行方案:

方案1:使用HtmlUnit(轻量级无头浏览器)

HtmlUnit是Java实现的无头浏览器,可以执行JS并渲染完整DOM,适合配合Jsoup使用。

示例代码:

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.IOException;

public class DynamicScraper {
    public static void main(String[] args) {
        String url = "https://docs.paloaltonetworks.com/pan-os/10-2/pan-os-admin/authentication/configure-multi-factor-authentication/configure-mfa-between-rsa-securid-and-firewall";
        
        // 初始化HtmlClient并启用JS执行
        try (WebClient webClient = new WebClient()) {
            webClient.getOptions().setJavaScriptEnabled(true);
            webClient.getOptions().setCssEnabled(false); // 禁用CSS提升速度
            webClient.getOptions().setThrowExceptionOnScriptError(false); // 忽略JS执行错误

            // 获取渲染后的页面
            HtmlPage page = webClient.getPage(url);
            webClient.waitForBackgroundJavaScript(3000); // 等待3秒让JS完成渲染

            // 转为Jsoup Document解析
            Document doc = Jsoup.parse(page.asXml());
            Elements hTags = doc.select("h1,h2,h3");
            System.out.println(hTags);

        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

方案2:使用Selenium(完整浏览器自动化)

Selenium可以控制真实浏览器(如Chrome、Firefox)执行JS并渲染页面,适配复杂动态场景。

示例代码(Chrome无头模式):

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.IOException;

public class SeleniumScraper {
    public static void main(String[] args) {
        String url = "https://docs.paloaltonetworks.com/pan-os/10-2/pan-os-admin/authentication/configure-multi-factor-authentication/configure-mfa-between-rsa-securid-and-firewall";
        
        // 配置Chrome无头模式
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless=new");
        options.addArguments("--disable-gpu");

        // 初始化WebDriver
        try (WebDriver driver = new ChromeDriver(options)) {
            driver.get(url);
            Thread.sleep(3000); // 等待页面加载完成

            // 获取渲染后的源码并解析
            String pageSource = driver.getPageSource();
            Document doc = Jsoup.parse(pageSource);
            Elements hTags = doc.select("h1,h2,h3");
            System.out.println(hTags);

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
注意事项
  • 使用无头浏览器时,需设置合理等待时间,确保JS完成内容渲染;
  • 部分网站会检测自动化工具,可调整请求头、添加代理或模拟真实用户行为;
  • HtmlUnit对复杂JS的支持弱于真实浏览器,若渲染失败优先选择Selenium。

内容的提问来源于stack exchange,提问作者Kali Linux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:20:39