使用jsoup解析html

本文介绍jsoup,一款用于Java的HTML解析库。它能从URL、文件或字符串中解析HTML,提供DOM、CSS选择器及类似JQuery的操作方法。文章详细讲解了如何使用jsoup进行URL解析、字符串解析、文件解析,以及如何使用DOM和选择器获取数据。

我们抓取到页面后,还需要对页面进行解析。可以使用字符串处理工具解析页面,也可以使用正则表达式,但是这些技术都会带来很大的开发成本,所以我们需要一款专门解析html页面的技术。

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

jsoup的主要功能如下:

  • 从一个URL,文件或者字符串中解析HTML

  • 使用DOM或CSS选择器来查找、取出数据

  • 可操作HTML元素、属性、文本

(1)加入pom依赖

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </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>

(2)解析url

    @Test
    public void testUrl() throws Exception {
        //解析URL地址
        Document doc= Jsoup.parse(new URL("https://movie.douban.com"),1000);
        //获取第一个title标签内的内容
        String title=doc.getElementsByTag("title").first().text();
        System.out.println(title);
    }

虽然使用jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等方式,而jsoup对这些的支持不是很好,所以我们一般只把jsoup当做html解析工具使用

(3)解析字符串

这里我们将豆瓣电影250的网站html保存下来,然后利用commons-io包的工具类获取该html的字符串

    @Test
    public void testString() throws Exception {
        //使用工具类读取文件,获取字符串
        String content = FileUtils.readFileToString(new File("C:\\Users\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
        //解析字符串
        Document doc = Jsoup.parse(content);
        String title = doc.getElementsByTag("title").first().text();
        System.out.println(title);
​
    }

(4)解析文件

    @Test
    public void testFile() throws Exception{
         //解析文件
        Document doc = Jsoup.parse(new File("C:\\Users\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
        String title = doc.getElementsByTag("title").first().text();
        System.out.println(title);
    }

(5)使用dom方式遍历文档

功能方法
根据id查询元素getElementById
根据标签获取元素getElementsByTag
根据class获取元素getElementsByClass
根据属性获取元素getElementsByAttribute
    @Test
    public void testDom() throws Exception{
        //解析文件
        Document doc = Jsoup.parse(new File("C:\\Users\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
        //1.根据id获取元素
        String element = doc.getElementById("content").text();
        System.out.println(element);
        //2.根据标签获取元素
        String title = doc.getElementsByTag("title").first().text();
        System.out.println(title);
        //3.根据class获取元素
        String element2 = doc.getElementsByClass("inp-btn").first().text();
        System.out.println(element2);
        //4.根据属性获取元素
        String element3 = doc.getElementsByAttribute("href").first().text();
        System.out.println(element3);
        String element4 = doc.getElementsByAttributeValue("href","https://movie.douban.com/subject/1292052/").text();
        System.out.println(element4);
    }

(6)从元素中获取数据

    @Test
    public void testData() throws Exception {
        //解析文件
        Document doc = Jsoup.parse(new File("C:\\Users\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
        //根据id获取数据
        Element element = doc.getElementById("top-nav-appintro");
        String str = "";
        //1.从元素中获取Id
        str = element.id();
        System.out.println(str);
        //2.从元素中获取className
        str = element.className();
        System.out.println(str);
        Set<String> classSet = element.classNames();
        for (String s : classSet) {
            System.out.println(s);
        }
        //3.从元素中获取属性的值
        String id = element.attr("class ");
        //4.从元素中获取所有属性
        Attributes attributes = element.attributes();
        System.out.println(attributes.toString());
        //5.从元素中获取文本内容text
        str = element.text();
        System.out.println(str);
    }

(7)Selector选择器

功能语法
通过标签查找元素tagname
通过Id查找元素#id
通过class名称查找元素.class
通过属性查找元素[attribute]
通过属性值查找元素[attr=value]
    @Test
    public void testSelector() throws Exception{
        //解析文件
        Document doc = Jsoup.parse(new File("C:\\Users\\杨峰宇\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
        //通过标签查找元素
        Elements elements = doc.select("span");
        for (Element element : elements) {
            System.out.println(element.text());
        }
        System.out.println("==================");
        //通过id查找元素,比如#id
        Elements elements1 = doc.select("#top-nav-appintro");
        System.out.println(elements1.first().text());
        System.out.println("==================");
        //通过class元素查找元素,比如.class
        Elements elements2 = doc.select(".inp-btn");
        for (Element element : elements2) {
            System.out.println(element.text());
        }
        System.out.println("==================");
        //通过属性查找元素,比如[abc]
        Elements elements3 = doc.select("[href]");
        for (Element element : elements3) {
            System.out.println(element.text());
        }
        System.out.println("==================");
        //通过属性值来查找元素,比如[abc=123]
        Elements elements4 = doc.select("[class=pic]");
        for (Element element : elements4) {
            System.out.println(element.text());
        }
    }

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值