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

Jsoup技术问询:如何判断class为col-md-6的div是否包含span.price子元素?

问题:如何判断div元素是否包含指定span子元素?

我需要判断class为col-md-6的div元素是否包含class为price的span子元素,有时候有,有时候没有。但我写的Jsoup代码没按预期输出0,求帮忙修正。

HTML示例结构

包含span.price的情况:

<div class="col-md-6"> 
 <ul> 
 <li> 
 <span class="price"> 
 <strong class="bold">70,000 </strong>USD</span> 
 </li> 
 <li> 
 </li> 
 <li>8775 views </li> 
 </ul> 
 </div>

不包含span.price的情况:

<div class="col-md-6"> 
 <ul> 
 <li> 
 </li> 
 <li>yesterday</li> 
 <li>53 views</li> 
 </ul> 
 </div>

我尝试的代码(未达预期)

try { 
    Document doc = Jsoup.connect("https://www.bezaat.com/ksa/riyadh/سيارات/all")
                        .userAgent("Mozilla/5.0(Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
                        .referrer("http://www.google.com")
                        .ignoreHttpErrors(true)
                        .get(); 
    Elements EE = doc.select("div.col-md-12").select("div.col-md-6") ; 
    Elements E = doc.select("div.col-md-12").select("div.media.ads-style.reg").select("div.media-left"); 
    for(int i = 0;i < E.size();i++) { 
        if(EE.get(i).select("span.price").text() != null) { 
            System.out.println(EE.get(i).select("span.price").text().replaceAll("[^0-9]","")); 
        } else { 
            System.out.println("0"); 
        }
    }
 } catch(java.io.IOException e) { 
    e.printStackTrace(); 
 }

回答

嗨,我看了你的代码,问题出在判断条件上!Jsoup里有个很容易踩的坑:哪怕select()没找到任何匹配的元素,调用text()返回的都是空字符串"",而不是null。所以你的text() != null条件永远是true,else分支根本不会执行,自然就出不来0的输出啦。

给你调整一下代码,核心是直接判断选中的元素是否存在,而不是判断文本是否为null:

try { 
    Document doc = Jsoup.connect("https://www.bezaat.com/ksa/riyadh/سيارات/all")
                        .userAgent("Mozilla/5.0(Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
                        .referrer("http://www.google.com")
                        .ignoreHttpErrors(true)
                        .get(); 
    // 简化选择器写法,链式select可以合并成一个字符串,更高效
    Elements EE = doc.select("div.col-md-12 div.col-md-6"); 
    Elements E = doc.select("div.col-md-12 div.media.ads-style.reg div.media-left"); 
    for(int i = 0; i < E.size(); i++) { 
        // 先获取目标span元素,存到变量里避免重复查询DOM
        Elements priceSpan = EE.get(i).select("span.price");
        // 用isEmpty()判断是否存在这个元素
        if(!priceSpan.isEmpty()) { 
            String cleanedPrice = priceSpan.text().replaceAll("[^0-9]", "");
            // 额外处理一下如果文本清理后为空的情况,防止输出空串
            System.out.println(cleanedPrice.isEmpty() ? "0" : cleanedPrice);
        } else { 
            System.out.println("0"); 
        }
    }
} catch(java.io.IOException e) { 
    e.printStackTrace(); 
}

几个关键的改进点:

  • 替换判断逻辑:用!priceSpan.isEmpty()来检查是否存在span.price元素,这是Jsoup里判断元素存在最可靠的方式
  • 减少DOM查询:把select("span.price")的结果存到变量里,避免在if和print里重复查询,提升代码效率和可读性
  • 优化选择器:把原来链式的select()合并成一个选择器字符串,写法更简洁,Jsoup解析起来也更高效
  • 鲁棒性增强:额外处理了价格文本清理后为空的情况,避免输出空字符串而不是0

另外,还要注意确认EE和E的元素数量是一致的哦,不然循环里EE.get(i)可能会抛出数组越界的异常~


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:06:00