您的位置:首页 > Web前端 > JavaScript

Jsoup学习之Jsoup类

2015-10-10 09:04 686 查看
Jsoup类

一、类结构

java.lang.Object

org.jsoup.Jsoup

public classJsoup

extends

Object

Jsoup类来自于org.jsoup.Jsoup包,并且继承自Object类。

二、方法

Method Summary
static String
clean(String bodyHtml, String baseUri, Whitelist whitelist)

使用Whitelist对输入的Html文档过滤,只允许特定的标签或者属性,防止恶意代码。
static String
clean(String bodyHtml, String baseUri, Whitelist whitelist, Document.OutputSettings outputSettings)

使用Whitelist对输入的Html文档过滤,只允许特定的标签或者属性,防止恶意代码。
static String
clean(String bodyHtml, Whitelist whitelist)

使用Whitelist对输入的Html文档过滤,只允许特定的标签或者属性,防止恶意代码。
static Connection
connect(String url)

创建URL连接
static boolean
isValid(String bodyHtml, Whitelist whitelist)

判断输入的Html文档是否符合Whitelist过滤条件的要求
static Document
parse(File in, String charsetName)

解析文件的内容,生成Html
static Document
parse(File in, String charsetName, String baseUri)

解析文件的内容,生成Html
static Document
parse(InputStream in, String charsetName, String baseUri)

读取输入流,解析成Document
static Document
parse(InputStream in, String charsetName, String baseUri, Parser parser)
读取输入流,解析成Document
static Document
parse(String html)

将字符串解析成Html文档
static Document
parse(String html, String baseUri)

将字符串解析成Html文档
static Document
parse(String html, String baseUri, Parser parser)

利用提供的Parser,将字符串解析成Html文档
static Document
parse(URL url,
int timeoutMillis)

通过URL,解析成Document
static Document
parseBodyFragment(String bodyHtml)

将Html片段解析成body格式
static Document
parseBodyFragment(String bodyHtml, String baseUri)

将Html片段解析成body格式
三、方法详解


clean

public static String clean(String bodyHtml,
String baseUri,
Whitelist whitelist)


使用Whitelist对输入的Html文档过滤,只允许特定的标签或者属性,防止恶意代码。

参数:

bodyHtml
–不安全的html片段

baseUri
–将html中相对路径转换为绝对路径的URL

whitelist
–白名单允许的html标签和属性

返回值:

安全的html片段

解析:

这个函数按照whitelist提供的过滤规则对html进行过滤,只保留whitelist允许的标签和属性。Html文档中往往会有很多的连接、图片、引用的外部脚本、css文件等,可能会是相对路径,jsoup会利用baseUri这个参数,自动为这些相对路径加前缀变成绝对路径。例如:<a
href=”/photo/2.jpg”>图片</a>会变成

<a href=”http://www.baidu.com/photo/2.jpg”>图片</a>

实例:

[java] view
plaincopyprint?

String html = "<p><ahref='http://www.baidu/' onclick='stealCookies()'> 百度一下,你就知道 </a></p>";

String doc = Jsoup.clean(html,Whitelist.basic());

//输出:<p><a href="http://www.baidu/"rel="nofollow"> 百度一下,你就知道 </a></p>

注:Whitelist包含几种过滤模式:none、basic、simpleText、basicWithImages、relaxed,具体过滤规则请参考:Whitelist类

拓展:
public static String clean(String bodyHtml,  Whitelist whitelist)
这个没有提供baseUri这个参数,即没有提供将相对路径转换为绝对路径的功能。
public static String clean(String bodyHtml,
String baseUri,
Whitelist whitelist,
Document.OutputSettings outputSettings)
Document.OutputSettings:文档的输出设置,控制精细打印


connect

public static Connection connect(String url)


创建URL连接

参数:

url
–必须为http或者https类型的连接.

返回值:

返回连接。你可以添加data,cookies,和 headers;设置user-agent,
referrer,method

解析:

与url建立连接,这个方法只支持http和https协议,连接的方式可以是get也可以是post,并且可以为连接提供所需要的信息,如data、cookies、userAgent、method等。

实例:

[java] view
plaincopyprint?

Document doc = Jsoup.connect("http://example.com")

.userAgent("Mozilla").data("name","jsoup").get();

Document doc = Jsoup.connect("http://example.com")

.cookie("auth","token").post();



[align=center][/align]


isValid

public static boolean isValid(String bodyHtml, Whitelist whitelist)


判断输入的Html文档是否符合Whitelist过滤条件的要求。

参数:

bodyHtml
–要测试的html

whitelist
–测试的过滤规则whitelist

返回值:

如果html中包含的标签和属性都包含在whitelist定义的规则内,即whitelist没有过滤掉bodyhtml中的内容,则返回true,否则返回false。

实例:

[java] view
plaincopyprint?

String html = "<p><ahref='http://www.baidu/'onclick='stealCookies()'> 百度一下,你就知道 </a></p>";

System.out.println(Jsoup.isValid(html, Whitelist.basic()));

//输出false,即Whitelist.basic()对html过滤掉了html中的部分内容,onclick这个属性不属于Whitelist.basic(),被过滤掉。




parse

public static Document parse(File in,  String charsetName, String baseUri)    throws IOException


解析文件的内容,生成Html

参数:

in
– html文件

charsetName
–设置文档编码格式。如果存在标签http-equiv,并且将charsetName设置为null,则按照标签http-equiv内规定的编码进行编码。否则为了安全起见,一般设置为UTF-8.

baseUri
-将html中相对路径转换为绝对路径的URL。

返回值:

返回健全的html文档

异常:

IOException
–如果文件找不到或者不能读取或者charsetName设置无效,抛出异常。

实例:

[java] view
plaincopyprint?

File file = new File("C://baidu.txt");

Document doc = Jsoup.parse(file,"GBK","http://www.baidu.com");

拓展:

public static Document parse(File in, String charsetName)  throws IOException




parse

public static Document parse(InputStream in,  String charsetName,String baseUri, Parser parser)    throws IOException


读取输入流,解析成Document。可以提供一个轮流的解析器(parser),例如XML解释器(或者非XML解释器)

参数:

in
–输入流。确保解析完成后关闭输入流。

charsetName
-设置文档编码格式。如果存在标签http-equiv,并且将charsetName设置为null,则按照标签http-equiv内规定的编码进行编码。否则为了安全起见,一般设置为UTF-8.

baseUri
-将html中相对路径转换为绝对路径的URL。

parser
–轮流解析器

返回值:

返回健全的html文档

异常:

IOException
-如果文件找不到或者不能读取或者charsetName设置无效,抛出异常。

实例:

[java] view
plaincopyprint?

FileInputStream input = new FileInputStream("C://baidu.txt");

Document doc = Jsoup.parse(input, "GBK", "http://www.baidu.com", Parser.htmlParser());

System.out.println(doc);

input.close();

拓展:

public static Document parse(InputStream in, String charsetName,String baseUri)   throws IOException




parse

public static Document parse(String html,  String baseUri,  Parser parser)


将Html字符串转换为Document。可以提供一个轮流的解析器(parser),例如XML解释器(或者非XML解释器)

参数:

html
– Html字符串

baseUri
-将html中相对路径转换为绝对路径的URL

parser
-轮流解析器

返回值:

返回健全的html文档

解析:

将Html字符串解析为Document。

实例:

[java] view
plaincopyprint?

String html = "<html><head><title>Firstparse</title></head>"

+ "<body><p>Parsed HTML into adoc.</p></body></html>";

Document doc = Jsoup.parse(html,"www.baidu.com", Parser.htmlParser());

System.out.println(doc);

拓展:

public static Document parse(String html, String baseUri)
public static Document parse(String html)



parse

public static Document parse(URL url,
int timeoutMillis) throws IOException

连接URL,获取Html转换为Document。通常使用connect函数来代替它,字符编码的设置根据http-equiv,或者自动回落为UTF-8编码。

参数:

url –需要连接的URL(使用GET方法),必须使用http或者https协议。

timeoutMillis –读取超时时间,毫秒级,如果超时会抛出IOException异常。

返回值:

解析后的Html

解析:

这个方法是与connect相兼容的方法,一般都使用connect方法来代替它。

异常:

MalformedURLException –请求的URL使用的协议不是http或者https。

HttpStatusException –HTTP返回的状态不是OK

UnsupportedMimeTypeException –响应的MIME类型不被支持

SocketTimeoutException –连接超时

IOException –连接或者读取错误

实例:

[java] view
plaincopyprint?

URL url = new URL("http://www.baidu.com");

Document doc = Jsoup.parse(url,500);

System.out.println(doc);


parseBodyFragment

public static Document parseBodyFragment(String bodyHtml, String baseUri)


将Html片段解析成body格式

参数:

bodyHtml
–Html片段

baseUri
-将html中相对路径转换为绝对路径的URL

返回值:

返回健全的html文档

实例:

[java] view
plaincopyprint?

String html = "<div><p>Loremipsum.</p>";

Document doc = Jsoup.parseBodyFragment(html);

System.out.println(doc);

拓展:

public static Document parseBodyFragment(String bodyHtml)


四、总结

Jsoup类的主要功能实现的是连接URL以及对解析Html。连接URL有两种方式:
public static Connection connect(String url)
public static Document parse(URL url, int timeoutMillis)


一般是使用connect方法。解析html的方式可以是从文件、输入流、字符串中获得:

public static Documentparse(File in, String charsetName,String baseUri)

public static Document parse(InputStream in,String charsetName,String baseUri)

public static Document parse(String html, String baseUri, Parser parser)

还可以使用clean方法对html进行过滤,使用isValid方法判断html是否符合过滤规则。

五、实例

[java] view
plaincopyprint?

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.net.URL;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.parser.Parser;

import org.jsoup.safety.Whitelist;

public class Load {

private static Document doc;

private static String html;

private static String url = "http://www.baidu.com";

private static String baseUri = "http://www.baidu.com";

public static Document getDoc() {

return doc;

}

public static void setDoc(Document doc) {

Load.doc = doc;

}

public static void main(String[] args){

try {

LoadHtml();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 设置代理服务器(ps:单位用的代理上网)

*/

public static void Host(){

System.getProperties().setProperty("proxySet", "true");

//用的代理服务器

System.getProperties().setProperty("http.proxyHost", "192.168.130.15");

//代理端口

System.getProperties().setProperty("http.proxyPort", "8848");

}

public static void LoadHtml() throws Exception{

Host();

JsoupClean();

JsoupConnect();

JsoupIsValid();

JsoupParseFile();

JsoupParseStream();

JsoupParseStr();

JsoupURL();

JsoupBody();

}

/**

* html过滤

*/

public static void JsoupClean(){

html = "<p><a href='http://blog.csdn.net/xyw_eliot' onclick='stealCookies()'> Eliot </a></p>";

String doc = Jsoup.clean(html, baseUri, Whitelist.basic());

System.out.println(doc);

}

/**

* 连接URL返回Document

* @throws IOException

*/

public static void JsoupConnect() throws IOException{

doc = Jsoup.connect(url).get();

System.out.println(doc);

}

/**

* 判断是否符合过滤规则

*/

public static void JsoupIsValid(){

html = "<p><a href='http://www.baidu/'onclick='stealCookies()'> 百度一下,你就知道 </a></p>";

System.out.println(Jsoup.isValid(html, Whitelist.basic()));

}

/**

* 解析文件

* @throws IOException

*/

public static void JsoupParseFile() throws IOException{

File file = new File("C://baidu.txt");

doc = Jsoup.parse(file, "GBK", baseUri);

System.out.println(doc);

}

/**

* 解析流

* @throws Exception

*/

public static void JsoupParseStream() throws Exception{

FileInputStream in = new FileInputStream("C://baidu.txt");

doc = Jsoup.parse(in, "GBK", baseUri);

System.out.println(doc);

in.close();

}

/**

* 解析字符串

*/

public static void JsoupParseStr(){

html = "<html><head><title>First parse</title></head>"

+ "<body><p>Parsed HTML into a doc.</p></body></html>";

doc = Jsoup.parse(html, baseUri);

System.out.println(doc);

}

/**

* 解析URL

* @throws Exception

*/

public static void JsoupURL() throws Exception{

URL url = new URL("http://www.baidu.com");

doc = Jsoup.parse(url, 500);

System.out.println(doc);

}

/**

* 将html片段解析为body格式

*/

public static void JsoupBody(){

html = "<div><p>Lorem ipsum.</p>";

doc = Jsoup.parseBodyFragment(html, baseUri);

System.out.println(doc);

Element body = doc.body(); //获取body元素,效果等同于doc.getElementsByTag("body")

System.out.println("*******");

System.out.println(body);

}

}

本文为Eliot原创,转载请注明出处:http://blog.csdn.net/xyw_eliot/article/details/9142865
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: