获取所有双色球数据,但是返回的都是html页面,需要进行处理,最开始想着用dom4j处理,发现不可行。之后想着自己处理,但是又太麻烦了,然后找到了jsoup,使用起来非常简单。
操作、解析HTML格式的数据
最好是懂些CSS和jQuery的选择器,页面的结构(标签、属性、文本)等
jsoup的使用和dom4j非常类似,最开始都是先获得一个Document对象,然后获取需要的子元素或节点进行操作,但是jsoup可以通过dom、css、和类似jquery的方法(选择器)来获取需要的数据。
提供了两个方法
Jsoup.parse(String html);
/*
开发时,一般路径都是相对地址,baseUri的作用就是类似于页面中 标签,指定相对地址的基础URL
如果html中有 标签,则只需要调用parse(String html)
*/
Jsoup.parse(String html,String baseUri);
String html = "First parse "
+ "Parsed HTML into a doc.
";
Document doc = Jsoup.parse(html);
使用Jsoup.parse(String html)一般来说会得到相同的结果。
区别就是该方法会将输入的任何片段解析进body元素内,而parse则不一定
方法:
Jsoup.parseBodyFragment(String html);
String html = "Lorem ipsum.
";
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();
}
使用选择器语法查找元素(超好用:)
方法
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中的选择器,都是类似的
选择器官方API
获取属性、文本、HTML内容
Node.attr(String key);//获取属性
Element.text();//获取元素内的文本内容
Element.html();//该元素内部html内容
Element.outerHtml();//该元素及其内部html内容
String html = "An example link.
";
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();
// "example"
String linkInnerH = link.html(); // "example"
其他方法详见官方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.html("lorem ipsum
"); // lorem ipsum
div.prepend("First
");
div.append("Last
");
// 输出: First
lorem ipsum
Last
Element span = doc.select("span").first(); // One
span.wrap(" ");
// 输出: One
Element div = doc.select("div").first(); //
div.text("five > four"); // five > four
div.prepend("First ");
div.append(" Last");
// 输出: First five > four Last
处理用户输入的内容,防止跨站脚本攻击
使用方式
String unsafe =
"";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
// 此时:
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