Jsoup既可以通过一个url网址,也可以通过存储html脚本的文件或者是存储html脚本的字符串作为数据源,然后通过DOM、CSS选择器来查找、抽取数据。
示例:
//url网址作为输入源
Document doc = Jsoup.connect("http://www.example.com").timeout(60000).get();
//File文件作为输入源
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://www.example.com/");
//String作为输入源
Document doc = Jsoup.parse(htmlStr);
和java script类似,Jsoup提供了下列的函数
getElementById(String id) 通过id获得元素
getElementsByTag(String tag) 通过标签获得元素
getElementsByClass(String className) 通过class获得元素
getElementsByAttribute(String key) 通过属性获得元素
同时还提供下面的方法提供获取兄弟节点:
siblingElements(), firstElementSibling(), lastElementSibling();nextElementSibling(), previousElementSibling()
用下面方法获得元素的数据:
attr(String key) 获得元素的数据
attr(String key, String value) 设置元素数据
attributes() 获得所有属性
id(), className() classNames() 得到id class的值
text()得到文本值
text(String value) 设置文本值
html() 获取html
html(String value)设置html
outerHtml() 获得内部html
data()获得数据内容
tag() 得到tag 和 tagName() 得到tagname
操作html提供了下面方法:
append(String html), prepend(String html)
appendText(String text), prependText(String text)
appendElement(String tagName), prependElement(String tagName)
html(String value)
下面举个列子,通过Jsoup抽取出一个DIV块里的所有链接地址。html文本如下:
测试连接
Android java代码如下:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
Document doc = Jsoup.connect("http://www.example.com").timeout(60000).get();
Elements divs = doc.select("div.my div");
StringBuilder linkBuffer = new StringBuilder();
if (divs != null) {
for (Element div : divs) {
Elements links = div.select("a[href]");
if (null != links) {
for (Element link : links) {
linkBuffer.append(link.attr("abs:href"));//相对地址会自动转成绝对url地址
linkBuffer.append(" ");
linkBuffer.append(link.text());
}
}
}
}
对于Jsoup更详细的信息,可以看官网的文档。http://www.open-open.com/jsoup
以上代码在Android 1.6及以上版本的手机上测试通过。
注意事项:
如果手机是通过wap方式联网,有可能需要设置http proxy,设置方式如下(代码放置在Jsoup.connect调用之前):
String host = android.net.Proxy.getDefaultHost();
int port = android.net.Proxy.getDefaultPort();
if (host != null && port != -1) {
System.getProperties().setProperty("proxySet", "true");
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxyPort", Integer.toString(port));
}
Jsoup进阶之获取指定数据
使用Jsoup解析html中的指定数据,十分方便。Jsoup工具十分强大,十分好用。但网上似乎没有很好的例子,本文的目的即在于此。建议仔细阅读代码中的几个例子,Jsoup解析数据不外乎这几种类型。
第一步:将Jsoup JAR包导入项目
第二步:使用Jsoup API
1, 定位
通过div的属性值,定位到html的div(块),即所需要内容对应的块。
示例代码如下:
1. class="content">
2.
2, 筛选数据
a, 通过标签头,在div中继续筛选数据。可能会找到很多的数据,这里会用到循环。见eg1。
1.//eg1:解析百度音乐
2. Document doc = Jsoup.connect("http://list.mp3.baidu.com/top/singer/A.html").get();
3. Element singerListDiv = doc.getElementsByAttributeValue("class", "content").first();
4. Elements links = singerListDiv.getElementsByTag("a");
5.
6. for (Element link: links) {
7. String linkHref = link.attr("href");
8. String linkText = link.text().trim();
9. System.out.println(linkHref);
10. }
b, 通过标签名,在div中筛选数据,选中此标签内的所有数据。见eg2
1.//eg2:解析万年历
2. Document doc = Jsoup.connect("http://www.nongli.com/item4/index.asp?dt=2012-03-03").get();
3. Element infoTable = doc.getElementsByAttributeValue("class", "table002").first();
4. Elements tableLineInfos = infoTable.select("tr");
5. for (Element lineInfo : tableLineInfos) {
6. String lineInfoContent = lineInfo.select("td").last().text().trim();
7. System.out.println("jsoup is :" + lineInfoContent);
8. }
c, 限定筛选条件。如果eg5
1.//eg5:查找html元素
2. File input = new File("/tmp/input.html");
3. Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/");
4. Elements links = doc.select("a[href]"); // 链接
5. Elements pngs = doc.select(); // 所有 png 的图片
6. Element masthead = doc.select("div.masthead").first();// div with class=masthead
7. Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
NOTE:
此处不能直接单独获得三组数据,获得的是总的三个数据。可通过正则表达式分解
3, 获取数据
即element.text()即可获得相关数据
plus: Jsoup有灵活的语法,比如通过class-value对指定div块,可通过select(div.value)找到,更多用法请参考文档!
以下给出所有示例代码:
package com.mike.activity;
import java.io.File;
import java.io.IOException;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class JsoupDemoActivity extends Activity {
/** Called when the activity is first created. */
private StringBuilder sb ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sb = new StringBuilder();
TextView textView = (TextView) findViewById(R.id.textView1);
try {
// //eg1:解析百度音乐
// Document doc = Jsoup.connect("http://list.mpbaidu.com/top/singer/A.html").get();
// Element singerListDiv = doc.getElementsByAttributeValue("class", "content").first();
// Elements links = singerListDiv.getElementsByTag("a");
//
// for (Element link: links) {
// String linkHref = link.attr("href");
// String linkText = link.text().trim();
// System.out.println(linkHref);
// }
//
//
// //eg2:解析万年历
// Document doc = Jsoup.connect("http://www.nongli.com/item4/index.asp?dt=2012-03-03").get();
// Element infoTable = doc.getElementsByAttributeValue("class", "table002").first();
// Elements tableLineInfos = infoTable.select("tr");
// for (Element lineInfo : tableLineInfos) {
// String lineInfoContent = lineInfo.select("td").last().text().trim();
// System.out.println("jsoup is :" + lineInfoContent);
// }
//eg3:解析指定段落的内容----注意此代码中的语法:
// Document doc = Jsoup.connect("http://passover.blog.51cto.com").get();
// Elements divs = doc.select("div.artHead");
// for (Element div: divs) {
// System.out.println(div.select("h3[class=artTitle]"));
// }
//eg4:
// Document doc = Jsoup.connect("http://passover.blog.51cto.com").get();
// //eg5:查找html元素
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/");
Elements links = doc.select("a[href]"); // 链接
所有 png 的图片
Element masthead = doc.select("div.masthead").first();// div with class=masthead
Elements resultLinks = doc.select("hr > a"); // direct a after h3
// //test
// File input = new File("D:/test.html");
// Document doc = Jsoup.parse(input,"UTF-8
/*
* 项目数据准备
*/
//eg5:万年历:http://www.zdic.net/nongli/2012-3-htm
//data1:dayFav(宜)
// Document doc = Jsoup.connect("http://www.zdic.net/nongli/2012-3-htm").get();
// Element dayFav = doc.getElementsByAttributeValue("class", "ly2").first();
// Elements dayFavItems = dayFav.getElementsByTag("a");
// for (Element dayFavItem:dayFavItems) {
// System.out.println(dayFavItem.text());
// }
//data2:dayUnfav(忌)
// Element dayUnfav = doc.getElementsByAttributeValue("class", "lj2").first();
// Elements dayUnfavItems = dayUnfav.getElementsByTag("a");
// for (Element dayUnfavItem:dayUnfavItems) {
// System.out.println(dayUnfavItem.text());
// }
//data3:taiSheng(胎神)
// Element taiSheng = doc.getElementsByAttributeValue("class", "lts2").first();
// System.out.println(taiSheng.text());
//data4:chong sha(冲煞信息)
// Element chong = doc.getElementsByAttributeValue("class", "lcs").first();
// Element sha = doc.getElementsByAttributeValue("class", "lcs").get(1);
// System.out.println(chong.text());
// System.out.println(sha.text());
//data5:zhengChong(正冲)和zhiXing(值星)
// Element zhengChong = doc.getElementsByAttributeValue("class", "lzc2").first();
// Element zhiXing = doc.getElementsByAttributeValue("class", "lzx2").first();
// System.out.println(zhengChong.text());
// System.out.println(zhiXing.text());
//data6:godFav(吉神宜趋)
// Element godUnfav = doc.getElementsByAttributeValue("class", "js2").first();
// System.out.println(godUnfav.text());
//data7:godUnfav(凶神宜忌)
// Element godFav = doc.getElementsByAttributeValue("class", "xs2").first();
// System.out.println(godFav.text());
//data8:pengZuBaiJi(彭祖百忌)
// Element pengZuBaiJi = doc.getElementsByAttributeValue("class", "pz2").first();
// System.out.println(pengZuBaiJi.text());
//data9:wuXing(五行)
// Element wuXing = doc.getElementsByAttributeValue("class", "wuh2").first();
// System.out.println(wuXing.text());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Jsoup网页内容抓取分析
在Java 程序在解析HTML 文档时,大家应该晓得htmlparser 这个开源项目,我也是使用过,不过这个程序到了2006年就没有更新了。由于我的基础较差,对于扩展自定义的标签还是不太懂,还是有超时问题困扰,偶然的机会中发现有jsoup,而且更新到了1.72版,使用起来还是很容易上手的。下面写些使用心得:
jsoup is a Java library for working with real-world HTML. It provides a very convenient API for extracting and manipulating data, using the best of DOM, CSS, and jquery-like methods.
jsuop是一款java的html解析器,提供一套非常省力的API,通过dom模型css和类似于jquery的方式来获取和操作数据。
功能:1.解析一个Html文档,2.解析一个body片段
Java代码
1.String html = "
2. + "
Parsed HTML into a doc.
";3.Document doc = Jsoup.parse(html);//分析文档,使用doc.toString()可以转为文本
4.Element body=doc.body();//获取body片段,使用body.toString()可以转为文本
获取方式:1.从本地文件加载 2.根据url地址获取
Java代码
1./**使用静态 Jsoup.parse(File in, String charsetName, String baseUri) 方法
2. *其中baseUri参数用于解决文件中URLs是相对路径的问题。
3. *如果不需要可以传入一个空的字符串。
4. */
5.File input = new File("/tmp/input.html");
6.Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
Java代码
1./**
2. *根据url直接获取内容,可以加入超时,get方法不行,就用post方法
3. *我在实际应用中,出现404,405,504等错误信息
4. *将get改为post就可以,或者反过来改
5. *如果等以后弄明白了,再来解释清楚
6. */
7.Document doc1 = Jsoup.connect("http://www.hao123.com/").get();
8.String title = doc1.title(); //获取网页的标题
9.String content=doc1.toString();//将网页转为文本
10.
11.Document doc2 = Jsoup.connect("http://www.hao123.com")
12. .data("query", "Java")//请求参数
13. .userAgent("Mozilla")//设置urer-agent
14. .cookie("auth", "token")//设置cookie
15. .timeout(50000)//设置连接超时
16. .post();//或者改为get
针对上一篇写的内容很简单,只是给大家抛出了有一个工具可以用来分析网页的内容,做java搜索爬虫使用,实际的使用并没有怎么介绍,现在这篇文章就来介绍一下用法,可能分析的不是很全面,欢迎批评。经过我的测试使用,jsoup分析网页结构和内容的功能远远强大于HtmlParser,无论是获取整个页面的文本,还是分析特定内容的网页结构,都是十分的方便。
附上链接:jsoup官网:http://jsoup.org/ ,中文jsoup:http://www.open-open.com/jsoup/
下面写些我的使用记录,希望大家如果能从我的方法中得到启发,鉴于本人从事开发工作不久,内容可能写的不是很好。
jsoup数据获取有两大方法:1.通过分析dom模型的网页标签和元素,2.select元素选择器,类似jquery方式(功能很强大,还支持正则表达式)。网页tag标签有body,div,table,tr,td,a,等等。元素的属性有,href,title,width,height,color等等,元素属性的值就是,例如:href=“www.baidu.com”, 值就是www.baidu.com 。width=“98%” 值就是98%
下面就以分析http://www.iteye.com首页的每日资讯为例,抓取每日资讯的标题和url地址,详细写出分析步骤:
1.用chrome浏览器的元素审查,分析页面的结构,得到每日资讯是div class= 2.写程序分析,首先根据url获取div文本,再来根据文本对内容进行分析 Java代码 1./** 2. * 根据jsoup方法获取htmlContent 3. * 加入简单的时间记录 4. * @throws IOException 5. */ 6.public static String getContentByJsoup(String url){ 7. String content=""; 8. try { 9. System.out.println("time=====start"); 10. Date startdate=new Date(); 11. Document doc=Jsoup.connect(url) 12. .data("jquery", "java") 13. .userAgent("Mozilla") 14. .cookie("auth", "token") 15. .timeout(50000) 16. .get(); 17. Date enddate=new Date(); 18. Long time=enddate.getTime()-startdate.getTime(); 19. System.out.println("使用Jsoup耗时=="+time); 20. System.out.println("time=====end"); 21. content=doc.toString();//获取iteye网站的源码html内容 22. System.out.println(doc.title());//获取iteye网站的标题 23. } catch (IOException e) { 24. e.printStackTrace(); 25. } 26. System.out.println(content); 27. return content; 28.} 3. 根据整个每日资讯所在的div层,获取那段内容(精确获取) Java代码 1. /** 2. * 使用jsoup来对文档分析 3. * 获取目标内容所在的目标层 4. * 这个目标层可以是div,table,tr等等 5. */ 6.public static String getDivContentByJsoup(String content){ 7. String divContent=""; 8. Document doc=Jsoup.parse(content); 9. Elements divs=doc.getElementsByClass("main_left"); 10. divContent=divs.toString(); 11. //System.out.println("div==="+divContent); 12. return divContent; 13.} 4.根据获取的目标层得到你所要的内容(title,url地址...等等) Java代码 1./** 2. * 使用jsoup分析divContent 3. * 1.获取链接 2.获取url地址(绝对路径) 4. */ 5. public static void getLinksByJsoup(String divContent){ 6. String abs="http://www.iteye.com/"; 7. Document doc=Jsoup.parse(divContent,abs); 8. Elements linkStrs=doc.getElementsByTag("li"); 9. System.out.println("链接==="+linkStrs.size()); 10. for(Element linkStr:linkStrs){ 11. String url=linkStr.getElementsByTag("a").attr("abs:href"); 12. String title=linkStr.getElementsByTag("a").text(); 13. System.out.println("标题:"+title+" url:"+url); 14. } 15. } 5.加入main方法里面执行测试 Java代码 1./** 2. * @method 测试获取内容程序 3. */ 4. public static void main(String[] args) throws IOException { 5. 6. /** 7. * 执行分析程序 8. */ 9. String url="http://www.iteye.com/"; 10. String HtmlContent=getContentByJsoup(url); 11. String divContent=getDivContentByJsoup(HtmlContent); 12. getLinksByJsoup(divContent); 13. } 6.附上结束语:jsoup功能很好很强大,附上的只是简单的使用方法,还有很多需要完善的内容,我其实使用也不到几天的时间。还有就是select功能还是很好用的,具体参考官方文档,写的非常的通俗易懂!附上程序源码和jsoup的jar包