简谈java解析HTML(org.jsoup.nodes.Document)

这篇文章主要是简单谈一下在开发工程中遇到的一个问题:解析HTML,用作记录方便自己以后查阅。

这次需要解析HTML用到的类是org.jsoup.nodes.Document。maven项目可以在pom.xml添加下面的依赖包获得该类的相关jar包。

<!-- 解析html -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.8.3</version>
        </dependency>

  jsoup不仅可以解析本地的HTML文件,还可以解析来自URL的HTML文件。下面分别来说一下如何解析这两种方式。

  • 本地HTML文件

  在获取本地HTML文件演示中,顺便介绍jsoup这个解析器的一个简单功能。我们先看如下页面:

 

 假设这是 一个某班级的成绩列表,其中发现第二条记录姓名是没有数据的,怎么办?有人说,是数据库数据不全导致的,检查数据库数据。但是别忘了,这个是一个已经生成好了的静态HTML页面,如果通过学号201200401112查询数据库,姓名是有数据的。这时候我们该如何给学号为201200401112的这位同学加上姓名呢?先抛开如何实现,有些人会有疑问这样的业务场景是否存在呢?可以告诉你,在我工作不到一年中,就遇到这样的业务场景。大概业务是这样的,当初要生成这个静态页面是因为要保存当时业务数据,提供以后查阅,至于为什么不用数据库保存当时记录,是因为这个关乎签章,总之是有这样的情况的。那么,进入如何去实现刚刚的那个问题,看代码:

@RequestMapping("/addName")
    public void addName(HttpServletResponse response) throws IOException {
        //设置响应字符编码
        response.setCharacterEncoding("UTF-8");
        //获取本地文件
        String filePath = "G:\\HBuilder\\bqjrlogin\\score.html";
        File file = new File(filePath);
        Document doc = Jsoup.parse(file, "UTF-8");
        //获取td标签集合
        Elements tds = doc.getElementsByTag("td");
        //在td集合标签中,在第九个添加姓名
        tds.get(9).appendText("张大胖");
        response.getWriter().write(doc.toString());
        response.getWriter().flush();
        response.getWriter().close();
    }

运行结果:

丢失的姓名回来了。这里添加的姓名是写死的,在实际开发中可以查询数据库,添加数据的数据。

Document doc = Jsoup.parse(file, "UTF-8"); 就这样,就可以解析到本地的HTML文件,具体实现注释中已写明。

  • URL获取的HTML文件

跟解析本地HTML差不多,还是直接看代码:

package com.wh.util;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

public class Test {

    private static final Logger LOGGER = LoggerFactory.getLogger(Test.class);

    public static void main(String[] args) {
        try {
            Document doc = Jsoup.connect("http://weixin.res.meizu.com/mx6/index.html").get();
            //获取页面的标题
            String title = doc.title();
            LOGGER.info(title);
        } catch (IOException e) {
            LOGGER.error("Test.main() error:" + e);
        }

    }

}

跟解析本地HTML文件唯一不一样的就是:

 Document doc = Jsoup.connect("http://weixin.res.meizu.com/mx6/index.html").get();
获取到URL地址的HTML文件后,其他操作都样。这里演示了如何获取到URL为:
http://weixin.res.meizu.com/mx6/index.html的标题。运行结果如下:

当然了,除了获取标题之外还可以对当前页面做很多操作,比如获取图片的标签src的地址,等等。这里只是简单做个例子,起到抛砖引玉作用,更多功能,需要深究。


posted @ 2016-09-17 15:08  WHqingwei  阅读(7686)  评论(0编辑  收藏  举报