這篇文章主要是簡單談一下在開發工程中遇到的一個問題:解析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的地址,等等。這里只是簡單做個例子,起到拋磚引玉作用,更多功能,需要深究。