Jsoup 解析Html源码实例

最近在做数据挖掘的过程中需要对html的源码进行解析,用到了Jsoup这个解析工具,下面写个基本实例来展现它的用法。

需要用到jar包:jsoup-1.7.2.jar,可以到jsoup的官网下载:http://jsoup.org/download

import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;


public class Main {
	public static void main(String[] args) throws IOException {
		
		//解析url
		String threadUrl = "http://bbs.tianya.cn/list.jsp?item=travel&order=1&k=%E6%97%A0%E9%94%A1";
		Document doc = (Document) Jsoup.connect(threadUrl).get();
		System.out.println(doc);
		//解析html文档
		//File input = new File("D:\\text.txt");
		//Document doc = Jsoup.parse(input, "UTF-8");	
		
		for(Element ele : doc.getElementsByClass("tab-bbs-list").get(0).select("tbody > tr")){
			if(!ele.select("td").toString().equals("")){
				String url = ele.select("td").get(0).select("a").attr("href");
				String text = ele.select("td").get(0).select("a").text();
				String author = ele.select("td").get(1).select("a").text();
				Integer click = Integer.valueOf(ele.select("td").get(2).text());
				Integer reply = Integer.valueOf(ele.select("td").get(3).text());
				Timestamp date = Timestamp.valueOf(ele.select("td").get(4).attr("title") + ":00");
			}
		}		
	}
}
下面附上一部分要解析的源码内容:

 
下面分析上面的代码:

Jsoup可以通过打开指定url的方式或者直接打开html文档的方式,对源码进行解析。

打开url方式:

		String threadUrl = "http://bbs.tianya.cn/list.jsp?item=travel&order=1&k=%E6%97%A0%E9%94%A1";
		Document doc = (Document) Jsoup.connect(threadUrl).get();
打开html文档:

		File input = new File("D:\\text.txt");
		Document doc = Jsoup.parse(input, "UTF-8");	
我使用的是打开url: http://bbs.tianya.cn/list.jsp?item=travel&order=1&k=%E6%97%A0%E9%94%A1

这是天涯论坛的某一个版块的内容,我要做的就是要提取里面的有用信息。

for(Element ele : doc.getElementsByClass("tab-bbs-list").get(0).select("tbody > tr")){
			if(!ele.select("td").toString().equals("")){
				String url = ele.select("td").get(0).select("a").attr("href");
				String text = ele.select("td").get(0).select("a").text();
				String author = ele.select("td").get(1).select("a").text();
				Integer click = Integer.valueOf(ele.select("td").get(2).text());
				Integer reply = Integer.valueOf(ele.select("td").get(3).text());
				Timestamp date = Timestamp.valueOf(ele.select("td").get(4).attr("title") + ":00");
			}
		}	
这个for循环做的是对有用信息的提取。首先,通过getElementsByClass("tab-bbs-list"),找到的是

 
 标题 作者 点击 回复 发表时间
求无锡周边带娃踏青的路线 utopia_rabbi 4 1 05-14 17:02
五一黄金假期狮王争霸赛霸气降临——盘点无锡影视城特色景点 微笑小胖子 13 0 04-26 17:20
无锡樱花温泉,梦回江南之境 hauhuacaocao 36 0 04-24 16:14
灵山大佛【无锡灵山大佛旅游攻略】灵山大佛游记 微笑小胖子 38 1 04-22 19:03
记江苏无锡的第一次骑行 我的儿子叫孙好帅 73 1 04-22 09:31
4月25日从重庆到南京-扬州-镇江-无锡-苏州-上海,自助,急求驴... 伊叶飘 33 0 04-16 13:07
无锡自由行 龙在鑫 443 10 03-30 23:14
无锡朋友-登山啦 championjun 16 0 03-18 16:48
.......
这个表格内存储着我们需要的全部信息,我们首先定位到这个表格的标签,通过class的名称tab-bbs-list找到它,后面的get(0),指定了是第一个class="tab-bbs-list tab-bbs-list-2">,如果源码中还有第二个这样的table,我们要指定使用第二个table,则就要用get(1)。

select("tbody > tr")
指的是查找tbody下所有tr标签(此处多谢yenshen指正),现在就将范围缩小到了所有tbody的tr标签了,即:

 
           标题 
          作者 
          点击 
          回复 
          发表时间 
          

  
          求无锡周边带娃踏青的路线 
          utopia_rabbi 
          4 
          1 
          05-14 17:02 
          
          
          五一黄金假期狮王争霸赛霸气降临——盘点无锡影视城特色景点 
          微笑小胖子 
          13 
          0 
          04-26 17:20 
          
....
我们就是在一步步的缩小范围。现在已经定位到.....范围。
!ele.select("td").toString().equals("")
表示说如果没有td这种标签,像第一个...,它内部就没有标签,所以我们要过滤掉,因为我们需要提取的信息在标签内。

如果存在标签,现在ele已经定位到了,以第二个为例:

  
          求无锡周边带娃踏青的路线 
          utopia_rabbi 
          4 
          1 
          05-14 17:02 
          


ele.select("td").get(0).select("a").attr("href");
ele.select("td")是检索出所有的,后边的get(0),指定了是定位到第一个,即:
求无锡周边带娃踏青的路线 
然后select("a")是定位到这个内部的标签:

求无锡周边带娃踏青的路线
.attr("href"):这个方法是获取属性名称为href的属性,即:"/post-travel-489511-1.shtml"

这样,我们就提取到了url。

text():方法是获取标签的内容

String text = ele.select("td").get(0).select("a").text();
我们定位到了...,text()就是取得...之间的内容。

附:

Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下:

查找元素
getElementById(String id) 
getElementsByTag(String tag) 
getElementsByClass(String className) 
getElementsByAttribute(String key) (and related methods) 
Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling() 
Graph: parent(), children(), child(int index)
元素数据
attr(String key)获取属性attr(String key, String value)设置属性 
attributes()获取所有属性 
id(), className() and classNames() 
text()获取文本内容text(String value) 设置文本内容 
html()获取元素内HTMLhtml(String value)设置元素内的HTML内容 
outerHtml()获取元素外HTML内容 
data()获取数据内容(例如:script和style标签) 
tag() and tagName()
操作HTML和文本
append(String html), prepend(String html) 
appendText(String text), prependText(String text) 
appendElement(String tagName), prependElement(String tagName) 
html(String value)
关于Jsoup的使用方法,具体可以参见Jsoup中文开发指南: Jsoup中文开发指南

本文为Eliot原创,转载请注明出处:http://blog.csdn.net/xyw_eliot/article/details/8927862

你可能感兴趣的:(API,Jsoup)