如何使用Jsoup解析HTML

本文介绍了Jsoup这款Java HTML解析器,详细讲解了如何解析URL、字符串和文件,以及如何通过DOM、CSS和jQuery类似的方法获取和操作HTML元素。内容涵盖根据ID、标签、class和属性获取元素,以及使用选择器的组合技巧。
摘要由CSDN通过智能技术生成

Jsoup简介

Jsoup是一款Java的HTML解析器,可以直接解析某个URL地址,HTML文本内容.它提供了一套非常省力的API,通过可以DOM,CSS以及类似于jQuery的操作方法取出和操作数据.

依赖

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.2</version>
</dependency>

<!--操作文件的工具类-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

<!--字符串处理工具-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>

<!--测试用例-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

解析URL

根据url下载数据,然后对下载的数据进行解析

@Test
public void testUrl() throws Exception {

    // 解析url
    // 第一个参数为访问的url,第二个参数为访问的超时时间
    Document doc = Jsoup.parse(new URL("http://www.baidu.com"), 1000);

    //使用标签选择器获取title中的内容
    String title = doc.getElementsByTag("title").first().text();

    System.out.println(title);
}

解析字符串

@Test
public void testString() throws Exception {

    //使用工具类读取文件,获取字符串
    String content = FileUtils.readFileToString(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");

    //使用Jsoup解析字符串
    Document doc = Jsoup.parse(content);

    String title = doc.getElementsByTag("title").first().text();

    System.out.println(title);
}

解析文件

@Test
public void testFile() throws Exception {

    //解析文件
    Document doc = Jsoup.parse(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");

    String title = doc.getElementsByTag("title").first().text();
    System.out.println(title);
}

使用Dom获取元素

1. 根据id获取元素

//1. 根据id获取元素
Element element = doc.getElementById("people");
//打印标签中的文本
System.out.println(element.text());

2. 根据标签获取元素

//2. 根据标签获取元素
Element element = doc.getElementsByTag("span").first();

System.out.println(element.text());

3. 根据class获取元素

//3. 根据class获取元素
Element element = doc.getElementsByClass("lione").first();

System.out.println(element.text());

4. 根据属性获取元素

//4. 根据属性获取元素
Element element1 = doc.getElementsByAttribute("abc").first();
//根据属性名和属性值获取元素
Element element2 = doc.getElementsByAttributeValue("abc", "123").first();

System.out.println(element1.text());

从元素中获取数据

@Test
public void testData() throws Exception {

    Document doc = Jsoup.parse(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");

    Element element = doc.getElementsByTag("img").first();

    String str = "";
    //从元素中获取id
    str = element.id();

    //从元素中获取className
    str = element.className(); //多个类名时不拆分
    Set<String> classNames = element.classNames();//多个类名时拆分

    //从元素中根据属性名获取属性值
    str = element.attr("src");

    //从元素中获取所有属性
    Attributes attributes = element.attributes();
    System.out.println(attributes);

    //从元素中获取文本内容
    str = element.text();


    System.out.println(str);

}

使用选择器获取元素

@Test
public void testSelector() throws Exception {
    Document doc = Jsoup.parse(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");

    //通过标签查找元素
    Elements elements = doc.select("span");
    //        for (Element element : elements) {
    //            System.out.println(element.text());
    //        }

    //通过id查找元素
    Element element = doc.select("#people").first();
    System.out.println(element.text());

    //通过class获取元素
    Element element1 = doc.select(".lione").first();
    System.out.println(element1.text());

    //通过属性获取元素
    Element element2 = doc.select("[abc]").first();
    System.out.println(element2.text());

    //通过属性名和属性值查找元素
    Elements elements1 = doc.select("[abc=123]");
    for (Element element3 : elements1) {
        System.out.println(element3.text());
    }
}

选择器的组合使用

@Test
public void testSelector2() throws Exception {

    Document doc = Jsoup.parse(new File("C:\\Users\\yubin14\\Desktop\\new.html"), "utf8");

    //元素+id: el#id
    Elements select = doc.select("div#a");
    System.out.println(select.text());

    //元素+class: el.class
    Element element = doc.select("li.news-meta-item").first();
    System.out.println(element.text());

    //元素+属性名:el[attr]
    Element first = doc.select("li[abc]").first();
    System.out.println(first.text());

    //查找某元素下面的子元素 parent child
    Elements elements = doc.select(".s-rank-title div");
    for (Element element1 : elements) {
        System.out.println(element1.text());
    }

    //查找某元素的直接子元素 parent > child
    Elements elements1 = doc.select("c > a");
    for (Element element1 : elements1) {
        System.out.println(element1.text());
    }

    //查找某元素的所有直接子元素 parent > *
    Elements select1 = doc.select("parent > *");
    for (Element element1 : select1) {
        System.out.println(element1.text());
    }

}

元素,id,class,属性名的组合是任意的,可以有两个,也可以有多个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值