使用Jsoup下Elements的remove方法过滤元素

今天在过滤元素的时候尝试使用remove方法,发现踩到了一个蛮大的坑,需要注意一下。

待解析的html片段:

<div class="divRow ">
	 <div class="width25per">王XX</div>
	 <div class="width25per">配偶</div>
	 <div class="mobileOnly">受益顺序</div>
	 <div class="width29per">1</div>
	 <div class="mobileOnly">百分比</div>
	 <div class="">100</div>
</div>

解析需求分析:
需要将里面除了“受益顺序”和“百分比”的其他4个字段信息提取出来,因为需要提取的字段的class属性值都没有统一的规律,所以并没有办法根据class属性值来提取,之前用的方法是按照下标来定位和获取元素,今天尝试下把不需要的去掉,只留下需要的。

第一版代码:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupTest {

    public static void main(String[] args) {

        String html = "<div class=\"divRow\">\n" +
                "                                 <div class=\"width25per\">王XX</div>\n" +
                "                                 <div class=\"width25per\">配偶</div>\n" +
                "\t\t\t\t\t\t\t\t <div class=\"mobileOnly\">受益顺序</div>\n" +
                "                                 <div class=\"width29per\">1</div>\n" +
                "\t\t\t\t\t\t\t\t <div class=\"mobileOnly\">百分比</div>\n" +
                "                                 <div class=\"\">100</div>\n" +
                "                              </div>";
                
        Document document = Jsoup.parse(html);
        Elements elements = document.select("div[class=divRow]");
        //将class属性为“mobileOnly”的元素去掉,把剩下的拿出来
        elements = elements.first().children().select("div[div=mobileOnly]").remove();
       for (Element element : elements) {
            System.out.println(element.html());
        }

    }

}

输出结果:

受益顺序
百分比

大家看到,这里留下来的反而是需要去掉的那两个元素……难道remove的意思不是把选择出来的那些元素去掉吗??只好去查阅Jsoup的官方文档。

找到Elements的remove方法解释:
将匹配的元素从DOM对象中移除,相当于把该html设置成了一个空的字符串

好像跟我一开始理解的没有本质上的差别,都是将选中的元素移除掉。
那只好把remove方法反过来用了……

修改后的代码:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * @Author zhihao_tan
 * @Date 2018/9/27 10:41
 * @Version 1.0
 */
public class JsoupTest {

    public static void main(String[] args) {

        String html = "<div class=\"divRow\">\n" +
                "                                 <div class=\"width25per\">王XX</div>\n" +
                "                                 <div class=\"width25per\">配偶</div>\n" +
                "\t\t\t\t\t\t\t\t <div class=\"mobileOnly\">受益顺序</div>\n" +
                "                                 <div class=\"width29per\">1</div>\n" +
                "\t\t\t\t\t\t\t\t <div class=\"mobileOnly\">百分比</div>\n" +
                "                                 <div class=\"\">100</div>\n" +
                "                              </div>";
        Document document = Jsoup.parse(html);
        Elements elements = document.select("div[class=divRow]");
        //将选择器修改一下,变成查找与选择器不匹配的元素,这里意思是查找不包含class=mobileOnly的所有div列表
        elements = elements.first().children().select("div:not(.mobileOnly)").remove();
        for (Element element : elements) {
            System.out.println(element.html());
        }


    }

}

输出结果:

王XX
配偶
1
100

成功取出需要的那四个元素了,莫非remove方法真的要反着用??
不管怎样,以后使用remove方法的时候得非常的慎重,一定要经过谨慎的试验。

猜你喜欢

转载自blog.csdn.net/weixin_41798450/article/details/82866819