jsoup 的使用

背景

获取所有双色球数据,但是返回的都是html页面,需要进行处理,最开始想着用dom4j处理,发现不可行。之后想着自己处理,但是又太麻烦了,然后找到了jsoup,使用起来非常简单。

jsoup的作用

操作、解析HTML格式的数据

开始

最好是懂些CSS和jQuery的选择器,页面的结构(标签、属性、文本)等

jsoup.png

jsoup的使用和dom4j非常类似,最开始都是先获得一个Document对象,然后获取需要的子元素或节点进行操作,但是jsoup可以通过dom、css、和类似jquery的方法(选择器)来获取需要的数据。

获取Document的四种方式

1、通过String(完整的HTML)

提供了两个方法
Jsoup.parse(String html);
/*
开发时,一般路径都是相对地址,baseUri的作用就是类似于页面中<base>标签,指定相对地址的基础URL
如果html中有<base>标签,则只需要调用parse(String html)
*/
Jsoup.parse(String html,String baseUri);


String html = "<html><head><title>First parse</title></head>"
  + "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);

2、通过String(HTML片段)

使用Jsoup.parse(String html)一般来说会得到相同的结果。
区别就是该方法会将输入的任何片段解析进body元素内,而parse则不一定

方法:
Jsoup.parseBodyFragment(String html);


String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();//doc.getElementsByTag("body")

3、从URL加载

Jsoup.connect(String url)获取一个Connection,而get()是执行这个请求,然后处理返回结果。
除此之外,Connection还可以设置cookie、请求参数、请求头等等
详见API文档

Jsoup.connect(String url);


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

Document doc = Jsoup.connect("http://example.com")
  .data("query", "Java")
  .userAgent("Mozilla")
  .cookie("auth", "token")
  .timeout(3000)
  .post();

4、从File加载

//如果不指定baseUri,此时,则会把文件位置作为baseUri
Jsoup.parse(File in, String charsetName);
Jsoup.parse(File in, String charsetName, String baseUri);

File input = new File("../tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://adamsun.com/");

获取元素

使用DOM类似的方法

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}
DOM-like.png

使用选择器语法查找元素(超好用:)

方法
Element.select(String selector);
Elements.select(String selector);

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Elements links = doc.select("a[href]"); // 带href属性的a标签
Elements pngs = doc.select("img[src$=.png]");  // img中src以.png结尾

Element masthead = doc.select("div.masthead").first();  // div中class为masthead的
Elements resultLinks = doc.select("h3.r > a"); //class为r的h3中的a标签

这里建议看下css3,jQuery中的选择器,都是类似的

选择器.png

选择器官方API

获取属性、文本、HTML内容

Node.attr(String key);//获取属性
Element.text();//获取元素内的文本内容
Element.html();//该元素内部html内容
Element.outerHtml();//该元素及其内部html内容

String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);
Element link = doc.select("a").first();

String text = doc.body().text(); // "An example link"
String linkHref = link.attr("href"); // "http://example.com/"
String linkText = link.text(); // "example""

String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>"
String linkInnerH = link.html(); // "<b>example</b>"

其他方法详见官方API
Node
Element
Elements

对数据进修改

详见上方API , Node、Element、Elements

doc.select("div.comments a").attr("rel", "nofollow");
doc.select("div.masthead").attr("title", "jsoup").addClass("round-box");

Element div = doc.select("div").first(); // <div></div>
div.html("<p>lorem ipsum</p>"); // <div><p>lorem ipsum</p></div>
div.prepend("<p>First</p>");
div.append("<p>Last</p>");
// 输出: <div><p>First</p><p>lorem ipsum</p><p>Last</p></div>

Element span = doc.select("span").first(); // <span>One</span>
span.wrap("<li><a href='http://example.com/'></a></li>");
// 输出: <li><a href="http://example.com"><span>One</span></a></li>
Element div = doc.select("div").first(); // <div></div>
div.text("five > four"); // <div>five &gt; four</div>
div.prepend("First ");
div.append(" Last");
// 输出: <div>First five &gt; four Last</div>

处理用户输入的内容,防止跨站脚本攻击

使用方式

String unsafe = 
  "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
// 此时: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

Whitelist提供了多个常用的过滤方法,来过滤不同类型的标签,但是可以通过调用Whitelist提供的方法在原来的基础上增加或减少标签。

在原来的基础上允许更多的规则通过
*   addTags(java.lang.String...);
*   addAttributes(java.lang.String, java.lang.String...);
*   addEnforcedAttribute(java.lang.String, java.lang.String, java.lang.String);
*   addProtocols(java.lang.String, java.lang.String, java.lang.String...);

在原来的基础上移除部分规则
*   removeTags(java.lang.String...)
*   removeAttributes(java.lang.String, java.lang.String...)
*   removeEnforcedAttribute(java.lang.String, java.lang.String)
*   removeProtocols(java.lang.String, java.lang.String, java.lang.String...)

Whitelist官方API

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352