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
相关产品推荐
相关产品推荐

