Jsoup是采用java编写的解析html文件的第三方库,使用Jsoup提供的API我们可以很方便的解析html文件。下面来介绍一下如何使用jsoup解析html。
1.首先我们要了解一下html的dom文档结构DOM节点介绍,下面是我截取的html文件的部分,会有助于理解下面的代码
2.使用jsoup我们可以解析本地文件中的html以及网络获取的html。网络获取的html居多,所以我们通过一个例子说明一下解析的步骤。
上代码:
package com.lql.jsoup;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class HtmlService {
public HtmlService() {
// TODO Auto-generated constructor stub
}
public static List<Map<String,Object>> parseHtml(String path) throws IOException{
List<Map<String, Object>> datas = new ArrayList<Map<String,Object>>();
Document document = Jsoup.connect(path).get();//从网络获取html文本
Elements unit_elemts = document.getElementsByClass("unit");//获取doc节点树中所有class="unit"的节点
for(int i = 0 ; i < unit_elemts.size(); i++){
Element element = unit_elemts.get(i);//取得第一个元素
Element h1_elemts = element.getElementsByTag("h1").get(0);
//用element取节点名为<h1></h1>的节点,返回值是一个集合,我们取集合中的第一个元素
Element a_h1_elemts = h1_elemts.getElementsByTag("a").get(0);
//用h1_elemts节点取节点名为<a></a>的第一个节点
String article_url = a_h1_elemts.attr("href");//取<a></a>中的href=""属性值
String article_title = a_h1_elemts.text();//取改节点的文本值
Element h4_elemts = element.getElementsByTag("h4").get(0);//<h4></h4>
Element ago_h4_elemts = h4_elemts.getElementsByClass("ago").get(0);
String date = ago_h4_elemts.text();//发布时间
Element view_time_h4_elemts = h4_elemts.getElementsByClass("view_time").get(0);
String view_time = view_time_h4_elemts.text();//浏览次数
Element num_recom_h4_elemts = h4_elemts.getElementsByClass("num_recom").get(0);
String num_recom = num_recom_h4_elemts.text();//评论次数
Element dl_elemts = element.getElementsByTag("dl").get(0);
Element dt_dl_elemt = dl_elemts.child(0);
String img_path = null;//图片路径,可能没有图片,故加异常处理
try {
Element a_dt_dl_elemt = dt_dl_elemt.getElementsByTag("a").get(0);
Element img_a_dt_dl_elemt = a_dt_dl_elemt.getElementsByTag("img").get(0);
img_path = img_a_dt_dl_elemt.attr("src");
} catch (Exception e) {
// TODO: handle exception
}
Element dd_dl_elemt = dl_elemts.getElementsByTag("dd").get(0);
String article_summary = dd_dl_elemt.text();//文章摘要
Map<String,Object> map = new HashMap<String, Object>();
map.put("article_url", article_url);
map.put("article_title", article_title);
map.put("date", date);
map.put("view_time", view_time);
map.put("num_recom", num_recom);
map.put("img_path", img_path);
map.put("article_summary", article_summary);
datas.add(map);
}
return datas;
}
}
package com.lql.jsoup;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
List<Map<String, Object>> datas = HtmlService.parseHtml("http://mobile.csdn.net/mobile/1");
for(Map<String,Object> map : datas){
System.out.println(map.toString());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面的方法是针对这个url进行编写的,代码的主要部分已经做了注释。
还有就是别忘了引入Jsoup.jar。解析的主要内容我参考了鸿洋大神的制作CSDN客户端的中的内容链接