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

Android中使用Jsoup提取WebView内网站通知计数的实现方案

没问题,我来帮你搞定这个需求——从已登录状态的WebView页面里提取通知计数,而且优先从data-unread属性取值对吧?其实分两步走就可以:先从WebView拿到当前页面的HTML源码,再用Jsoup解析提取数值,下面详细说:

步骤1:从WebView获取已登录页面的HTML源码

Jsoup本身是直接发送HTTP请求来获取页面的,但它没法共享WebView里的登录会话(比如Cookie、本地存储的登录信息),所以必须从WebView里直接拿已经渲染好的、带有登录状态的页面HTML。

在Android中,你可以用WebView的evaluateJavascript()方法执行一段JS,获取完整的DOM内容:

// 确保WebView已经加载完成,比如在WebViewClient的onPageFinished里调用
webView.evaluateJavascript("document.documentElement.outerHTML;", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String html) {
        // 这里拿到的html就是WebView当前页面的完整HTML源码
        // 接下来调用解析方法
        int notificationCount = extractNotificationCount(html);
        // 把数值存入变量,做后续处理
        // ...
    }
});

注意:evaluateJavascript()是异步执行的,所以解析逻辑要写在回调里。如果拿到的HTML带有转义字符(比如\n、\"),可以用Html.fromHtml(html).toString()来做转义处理。

步骤2:用Jsoup解析HTML,提取通知计数

拿到HTML之后,就可以用Jsoup按照你的需求解析了:优先取data-unread属性的值,如果这个属性无效(不存在或不是整数),再 fallback 到<span class="toolbar__badge">里的文本。

代码示例如下:

private int extractNotificationCount(String html) {
    // 解析HTML为Jsoup的Document对象
    Document doc = Jsoup.parse(html);
    
    // 定位到目标a标签:匹配class为toolbar__item和cta-login的a元素
    Element notificationLink = doc.selectFirst("a.toolbar__item.cta-login");
    if (notificationLink == null) {
        // 找不到目标元素,返回默认值(比如0)
        return 0;
    }

    // 第一步:优先获取data-unread属性
    String unreadAttrValue = notificationLink.attr("data-unread");
    if (unreadAttrValue != null && !unreadAttrValue.trim().isEmpty()) {
        try {
            // 转成整数返回
            return Integer.parseInt(unreadAttrValue.trim());
        } catch (NumberFormatException e) {
            // 属性值不是合法整数,继续尝试提取span内容
            e.printStackTrace();
        }
    }

    // 第二步:如果data-unread无效,提取span标签里的文本
    Element badgeSpan = notificationLink.selectFirst("span.toolbar__badge");
    if (badgeSpan != null) {
        String badgeText = badgeSpan.text().trim();
        if (!badgeText.isEmpty()) {
            try {
                return Integer.parseInt(badgeText);
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }
    }

    // 所有情况都取不到数值,返回默认值
    return 0;
}
额外注意事项
  • 要等WebView完全加载完页面再调用evaluateJavascript(),可以在WebViewClient的onPageFinished(WebView view, String url)方法里触发,避免拿到不完整的HTML。
  • WebView会自动保存登录会话(比如Cookie),所以只要用户在WebView里完成登录,后续获取的页面就是已登录状态的,Jsoup解析就能拿到正确的通知计数。
  • 记得处理异常情况:比如元素不存在、属性/文本为空、内容不是整数的情况,避免应用崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:47:31