Jsoup解析Html教程
Jsoup应该说是最简单快速的Html解析程序了,完善的API以及与JS类似的操作方式,为Java的Html解析带来极大的方便,结合多线程适合做一些网络数据的抓取,本文从一下几个方面介绍一下,篇幅有限,化繁为简。
下载Jsouphttp://jsoup.org/download
查看官方提供的手册:http://jsoup.org/cookbook/
获取一个Document,这是Jsoup最核心的一个对象
有三种途径来加载Document:字符串,URL地址,文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/** * */package org.xdemo.example.jsoupdemo.input;import java.io.File;import java.io.IOException;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.safety.Whitelist;/** * @作者 Goofy * @邮件 252878950@qq.com * @日期 2014-4-2上午10:54:53 * @描述 */public class ParseDocument {/** * 将String转换成Document * @return org.jsoup.nodes.Document */public static Document parseHtmlFromString(){String html = "<html><head><title>标题</title></head>"+ "<body><p>段落</p></body></html>";Document doc = Jsoup.parse(html);return doc;}/** * 注意:这是一个不安全的方法 * 将String转换成Html片段,注意防止跨站脚本攻击 * @return Element */public static Element parseHtmlFragmentFromStringNotSafe(){String html = "<div><p>Lorem ipsum.</p>";Document doc = Jsoup.parseBodyFragment(html);Element body = doc.body();return body;}/** * 这是一个安全的方法 * 将String转换成Html片段,注意防止跨站脚本攻击 * @return Element */public static Element parseHtmlFragmentFromStringSafe(){String html = "<div><p>Lorem ipsum.</p>";//白名单列表定义了哪些元素和属性可以通过清洁器,其他的元素和属性一律移除Whitelist wl=new Whitelist();//比较松散的过滤,包括//"a", "b", "blockquote", "br", "caption", "cite", "code", "col", //"colgroup", "dd", "div", "dl", "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6", //"i", "img", "li", "ol", "p", "pre", "q", "small", "strike", "strong", //"sub", "sup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "u", //"ul"Whitelist.relaxed();//没有任何标签,只有文本Whitelist.none();//常规的过滤器//"a", "b", "blockquote", "br", "cite", "code", "dd", "dl", "dt", "em", //"i", "li", "ol", "p", "pre", "q", "small", "strike", "strong", "sub", //"sup", "u", "ul"Whitelist.basic();//常规的过滤器,多了一个img标签Whitelist.basicWithImages();//文本类型的标签//"b", "em", "i", "strong", "u"Whitelist.simpleText();//另外还可以自定义过滤规则,例如wl.addTags("a");//执行过滤Jsoup.clean(html, wl);Document doc = Jsoup.parseBodyFragment(html);Element body = doc.body();return body;}/** * 从URL加载 * @return Document */public static Document parseDocumentFromUrl(){Document doc = null;try {doc = Jsoup.connect("http://www.google.com/").get();//获取标题String title = doc.title();System.out.println(title);//输出:Google//data(key,value)是该URL要求的参数//userAgent制定用户使用的代理类型//cookie带上cookie,如cookie("JSESSIONID","FDE234242342342423432432")//连接超时时间//post或者get方法doc = Jsoup.connect("http://www.xxxxx.com/") .data("query", "Java") .userAgent("Mozilla") .cookie("auth", "token") .timeout(3000) .post();} catch (IOException e) {e.printStackTrace();}return doc;}/** * 从文件加载 * @return Document */public static Document parseDocumentFromFile(){File input = new File("/tmp/input.html");Document doc=null;try {//从文件加载Document文档doc = Jsoup.parse(input, "UTF-8");System.out.println(doc.title());} catch (IOException e) {e.printStackTrace();}return doc;}} |
2.选择器
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
package org.xdemo.example.jsoupdemo.extracter;import java.util.regex.Pattern;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;/** * @作者 Goofy * @邮件 252878950@qq.com * @日期 2014-4-2上午10:41:19 * @描述 选择器 操作示例 */public class Selector {public static void main(String[] args) {Document doc;try {//获取文档doc=Jsoup.connect("http://xxx.com/").get();/*****获取单一元素******///与JS类似的根据ID选择的选择器<div id="content"></div>Element content = doc.getElementById("content");/*****一下方法的返回值都是Elements集合******///获取所有的a标签<a href="#"></a>content.getElementsByTag("a");//类选择器<div></div>doc.getElementsByClass("divClass");//获取Document的所有元素doc.getAllElements();//根据属性获取元素<a href="#"></a>doc.getElementsByAttribute("href");//根据属性前缀获取元素 <li data-name="Peter Liu" data-city="ShangHai" data-lang="CSharp" data-food="apple">doc.getElementsByAttributeStarting("data-");//根据key-value选择如<a href="http://xdemo.org"></a>doc.getElementsByAttributeValue("href","http://xdemo.org");//和上面的正好相反doc.getElementsByAttributeValueNot("href","http://xdemo.org");//根据key-value,其中value可能是key对应属性的一个子字符串,选择如<a href="http://xdemo.org"></a>doc.getElementsByAttributeValueContaining("href", "xdemo");//根据key-value,其中key对应值的结尾是value,选择如<a href="http://xdemo.org"></a>doc.getElementsByAttributeValueEnding("href", "org");//和上面的正好相反doc.getElementsByAttributeValueStarting("href","http://xdemo");//正则匹配,value需要满足正则表达式,<a href="http://xdemo.org"></a>,如href的值含有汉字doc.getElementsByAttributeValueMatching("href",Pattern.compile("[\u4e00-\u9fa5]"));//同上doc.getElementsByAttributeValueMatching("href", "[\u4e00-\u9fa5]");//根据元素所在的z-index获取元素doc.getElementsByIndexEquals(0);//获取z-index大于x的元素doc.getElementsByIndexGreaterThan(0);//和上面的正好相反doc.getElementsByIndexLessThan(10);//遍历标签for (Element link : content.getElementsByTag("a")) { String linkHref = link.attr("href"); String linkText = link.text();}/**************一些其他常用的方法**************///获取网页标题doc.title();//获取页面的所有文本doc.text();//为元素添加一个css classcontent.addClass("newClass");//根据属性获取值content.attr("id");//获取所有子元素content.children();//获取元素内的所有文本content.text();//获取同级元素content.siblingElements();} catch (Exception e) {e.printStackTrace();}}} |
3.最后说一点,就是安全问题,解析html的时候要防止跨站脚本攻击cross-site scripting (XSS),作者也考虑到了这一点,所以真正使用时候需要注意。
Jsoup解析Html教程的更多相关文章
- 一步步教你为网站开发Android客户端---HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新ListView
本文面向Android初级开发者,有一定的Java和Android知识即可. 文章覆盖知识点:HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新List ...
- Android利用Jsoup解析html 开发网站客户端小记。
这些天业余时间比较多,闲来无事,想起了以前看过开发任意网站客户端的一篇文章,就是利用jsoup解析网站网页,通过标签获取想要的内容.好了废话不多说,用到的工具为 jsoup-1.7.2.jar包,具体 ...
- [java] jsoup 解析网页获取省市区域信息
到国家统计局抓取数据, 到该class下解析数据 /** * jsoup解析网页 * @author xwolf * @date 2016-12-13 18:11 * @since V1.0.0 */ ...
- jsoup解析HTML及简单实例
jsoup 中文参考文献 http://www.open-open.com/jsoup/ 本文将利用jsoup,简单实现网络抓取的功能,并给出一个小实例,该实例效果为:获取作者本人在博客园写的所 ...
- jsoup解析HTML
Connection conn = Jsoup.connect(String url); conn.data("txtBill", key);// 设置关键字查询字段 Docume ...
- Android开发探秘之三:利用jsoup解析HTML页面
这节主要是讲解jsoup解析HTML页面.由于在android开发过程中,不可避免的涉及到web页面的抓取,解析,展示等等,所以,在这里我主要展示下利用jsoup jar包来抓取cnbeta.com网 ...
- Jsoup 解析 HTML
Jsoup 文档 方法 要取得一个属性的值,可以使用Node.attr(String key) 方法 对于一个元素中的文本,可以使用Element.text()方法 对于要取得元素或属性中的HTML内 ...
- Jsoup解析HTML、加载文档等实例
一.引入jsoup的jar包:http://jsoup.org/download 补充:http://jsoup.org/apidocs/ Jsoup API 可以了解更详细的内容 二.Js ...
- Jsoup解析获取品花社图片
Jsoup解析获取品花社图片 emmmm,闲着没事,想起了之前一个学长做的品花社的APP,刚好之前有了解Jsoup这个Java解析HTML的库,便花了三四个小时写了这个东西,把网站上大大小小的MM的图 ...
随机推荐
- 【转】Notepad++插件NppProject发布
原文网址:http://darkbull.net/article/NppProject/ 如果notepad++安装在 系统盘/program files/ 目录下,可能会提示错误.将npp移到其他目 ...
- Makefile第四讲:include 引用其它makefile文件
main.cpp #include "classes/fun.h" int main() { Test::display("Hello makefile"); ...
- android学习——环境搭建之HelloWorld
一.在开始Android开发之旅启动之前,首先要搭建环境,然后创建一个简单的HelloWorld.本文的主题如下: 1.1.JDK安装 1.2.Eclipse安装 1.3.Android SDK安装 ...
- Python 实现网络爬虫小程序
Python很简洁,也很强大,作为兴趣,值得一学! 下面这个程序实现的是从一个网站上下载图片,根据自己需要可以进行修改 import re import urllib def gethtml(ur ...
- HDU-1339 A Simple Task
http://acm.hdu.edu.cn/showproblem.php?pid=1339 正常做法超时,要有点小技巧存在. A Simple Task Time Limit: 2000/1000 ...
- SQL语句 DML,DDL,DCL(转载)
数据控制语言(DCL)是用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT.DENY.REVOKE等语句,在默认状态下,只有 sysadmin.dbcreator.db_owner或d ...
- 如何避免jQuery库和其他库的冲突
默认情形:jQuery用$作为自身的快捷方式 1. jQuery库在其他库之后导入 (1)方法:使用jQuery.noConflict()函数将变量$的控制权转移给其他库 (2)操作: (a)在js代 ...
- ios 游戏《魂斗罗》 AL文件素材破解
1.破解原理非常简单就是找png的8字节的前缀(baidu png 文件编码格式). 2.破解就图就可以看见了 3.这样一个个个的改是不是非常麻烦,所有我专门写了个py脚本在干这事!一步搞定! 源码如 ...
- 博客搬家到CSDN:http://blog.csdn.net/yeweiouyang
博客搬家到CSDN:http://blog.csdn.net/yeweiouyang
- HDU 2102 A计划(三维BFS)
这题太欢乐了......虽然wa了几次,但是想到骑士在两幅图的传送门中传来传去就觉得这骑士太坑了 #include <cstdio> #include <iostream> # ...