jsoup 的使用

作者: AdamSun19 | 来源:发表于2019-08-12 12:44 被阅读0次

    背景

    获取所有双色球数据,但是返回的都是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

    相关文章

      网友评论

        本文标题:jsoup 的使用

        本文链接:https://www.haomeiwen.com/subject/ovyyjctx.html