选择元素Jsoup的最内层子元素

时间:2015-08-07 21:34:26

标签: java android jsoup

我试图抓取以下HTML:

doc.select("[class=cellRight]")

我正在尝试提取学生成绩的值,如果没有成绩,那么如果是这种情况,html中将出现“无成绩”的值。但是,当我执行以下选择请求时:

<div class="gn">
  <div class="tx">
    2
  </div>
  <div class="in">
    <div class="tx">
      1
    </div>
 </div>
</div>

<style>
body {
  margin-left: 0px;
  padding-left: 0px;
}

.gn {
  width: 800px;
  height: 280px;
  background-color: rgb(34,34,34);
  text-align: -webkit-center;
  padding: 40px;
}

.in {
  background-color: #f79779;
  width: 800px;
  height: 300px;
}

.tx {
  font-size: 172px;
  color: #fff;
  text-align: right;
  padding-right:120px;
}

@media (max-width:700px){
  .gn {
    padding:0px;
    width:400px;
  }
  .tx {
    padding-right:60px;
   } 
  .in {
    width:400px;
  }
}
</style>

我得到一个输出,其中所有等级值都列出两次(因为它们嵌套在包含[class = cellRight]区分符的两个元素中,以及正常数量的“无成绩”列表。所以我的问题是,如何我是否只能在包含识别符[class = cellRight]的文档中选择最里面的子项?(我已经处理了空白值的问题)所有帮助都表示赞赏!!

1 个答案:

答案 0 :(得分:1)

有很多可能性。

一个是这样的:如果它们也携带该类,则测试每个“cellRight”元素的所有父元素。如果您找到它,请放弃:

List<Element> keepList = new ArrayList<>();
Elements els = doc.select(".cellRight");
for (Element el : els){
  boolean keep = true;
  for (Element parentEl : el.parents()){
     if (parentEl.hasClass("cellRight")){
        //parent has class as well -> discard!
        keep = false;
        break;
     }
  }
  if (keep){
    keepList.add(el);
  }
}
//keepList now contains inner most elements with your class

请注意,这是在没有编译器的情况下编写的。可能存在拼写/语法错误。

其他说明。只有在有这个单一类的情况下,"[class=cellRight]"的使用才有效。对于随机顺序的多个clres(完全可以预期),最好使用点语法".cellRight"