这篇文章主要是简单谈一下在开发工程中遇到的一个问题:解析HTML,用作记录方便自己以后查阅。
这次需要解析HTML用到的类是org.jsoup.nodes.Document。maven项目可以在pom.xml添加下面的依赖包获得该类的相关jar包。
<dependency> <groupId>org.jsoupgroupId> <artifactId>jsoupartifactId> <version>1.8.3version> 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的地址,等等。这里只是简单做个例子,起到抛砖引玉作用,更多功能,需要深究。