zoukankan      html  css  js  c++  java
  • Jsoup解析HTML、加载文档等实例

    一、引入jsoup的jar包:http://jsoup.org/download

      补充:http://jsoup.org/apidocs/   Jsoup API    可以了解更详细的内容

    二、Jsoup将html字符串解析成Document结构

    public void testJsoupHtml(){
            String html="<table><tr><td>名称</td><td>价格(元/本)</td><td>描述</td></tr><tr><td>《雾都的孤儿》</td><td>33.4</td><td>叙述雾都的孤儿</td></tr></table>";
            Document doc = Jsoup.parse(html);
            System.out.println(doc.childNodeSize());
        }

    Jsoup.parse(String str)说明:该解析器能够尽最大可能从你提供的HTML文档来创见一个干净的解析结果,无论HTML的格式是否完整。比如它可以处理:

      1、没有关闭的标签 (比如: <p>Lorem <p>Ipsum parses to <p>Lorem</p> <p>Ipsum</p>)
      2、隐式标签 (比如. 它可以自动将 <td>Table data</td>包装成<table><tr><td>?)
      3、创建可靠的文档结构(html标签包含head 和 body,在head只出现恰当的元素)

        补充说明:文档的对象模型简述:

          1、文档由多个Elements和TextNodes组成 (以及其它辅助nodes).
          2、其继承结构如下:Document继承Element继承Node. TextNode继承 Node.
          3、一个Element包含一个子节点集合,并拥有一个父Element。他们还提供了一个唯一的子元素过滤列表。

    三、Jsoup通过URL解析html文档   获得Document对象  

      具体代码如下:

    public void testJsoupUrl() throws IOException{
            String url="http://ntbedi04:11080/edi/task/allTask";
            Document doc=Jsoup.connect(url).get();
            String title=doc.title();
            System.out.println("文档的名称:"+title);
        }

      connect(String url)创建一个新的Collection对象,然后通过get()获得Document对象。

      connect()还有一些属性可以满足特殊的需求:

    public void testJsoupUrlPost() throws IOException{
            String url="";
            Document doc = Jsoup.connect(url)
                      .data("query", "Java")   //post请求的参数
                      .userAgent("Mozilla")    //请求代理
                      .cookie("auth", "token")//cookie
                      .timeout(300000)   //请求时间的设置
                      .post();  
            System.out.println(doc.title());
        }

    三、Jsoup解析本地文件html文件

    public void testJsouploc() throws IOException{
            File htmlf=new File("C:/Users/Administrator/Desktop/choujiang.html");
            Document doc=Jsoup.parse(htmlf, "UTF-8");
            System.out.println(doc.title());
        }

    对于相对路径中的文件,可以用parse(File in,String charsetName,String baseUrl)

      baseUri 参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串。
      另外还有一个方法parse(File in, String charsetName) ,它使用文件的路径做为 baseUri。 这个方法适用于如果被解析文件位于网站的本地文件系统,且相关链接也指向该文件系统。

    四、Jsoup中Document对象的操作

      Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下:
     查找元素
      getElementById(String id)
      getElementsByTag(String tag)
      getElementsByClass(String className)
      getElementsByAttribute(String key) (and related methods)
      Element siblings: siblingElements(), firstElementSibling(), lastElementSibling();nextElementSibling(), previousElementSibling()
      Graph: parent(), children(), child(int index)

     元素数据
      attr(String key)获取属性attr(String key, String value)设置属性
      attributes()获取所有属性
      id(), className() and classNames()
      text()获取文本内容text(String value) 设置文本内容
      html()获取元素内HTMLhtml(String value)设置元素内的HTML内容
      outerHtml()获取元素外HTML内容
      data()获取数据内容(例如:script和style标签)
      tag() and tagName()

    操作HTML和文本
      append(String html), prepend(String html)
      appendText(String text), prependText(String text)
      appendElement(String tagName), prependElement(String tagName)
      html(String value)

    简单实例:

    public void testJsoupHtml(){
            String html="<table><tr><td>名称</td><td>价格(元/本)</td><td>描述</td></tr><tr><td>《雾都的孤儿》</td><td>33.4</td><td>叙述雾都的孤儿</td></tr></table>";
            Document doc = Jsoup.parse(html);
            Elements tables=doc.getElementsByTag("table");
            Elements tdlist=tables.get(0).getElementsByTag("td");
        //输出单元格中的内容
    for (Element str : tdlist) { System.out.println(str.text()); } }

    特别之处:获得某个值或对象

      可以使用Element.select(String selector) 和 Elements.select(String selector) 方法实现:

    Selector选择器概述
    tagname: 通过标签查找元素,比如:a
    ns|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找 <fb:name> 元素
    #id: 通过ID查找元素,比如:#logo
    .class: 通过class名称查找元素,比如:.masthead
    [attribute]: 利用属性查找元素,比如:[href]
    [^attr]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 Dataset属性的元素
    [attr=value]: 利用属性值来查找元素,比如:[width=500]
    [attr^=value], [attr$=value], [attr*=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
    [attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i).(png|jpe?g)]
    *: 这个符号将匹配所有元素

    Selector选择器组合使用

    el#id: 元素+ID,比如: div#logo
    el.class: 元素+class,比如: div.masthead
    el[attr]: 元素+class,比如: a[href]
    任意组合,比如:a[href].highlight
    ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找在"body"元素下的所有p元素
    parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
    siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div
    siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
    el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo

    伪选择器selectors

    :lt(n): 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3) 表示小于三列的元素
    :gt(n):查找哪些元素的同级索引值大于n,比如: div p:gt(2)表示哪些div中有包含2个以上的p元素
    :eq(n): 查找哪些元素的同级索引值与n相等,比如:form input:eq(1)表示包含一个input标签的Form元素
    :has(seletor): 查找匹配选择器包含元素的元素,比如:div:has(p)表示哪些div包含了p元素
    :not(selector): 查找与选择器不匹配的元素,比如: div:not(.logo) 表示不包含 class=logo 元素的所有 div 列表
    :contains(text): 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)
    :containsOwn(text): 查找直接包含给定文本的元素
    :matches(regex): 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
    :matchesOwn(regex): 查找自身包含文本匹配指定正则表达式的元素
  • 相关阅读:
    AJAX问题总结(针对JAVA)
    关于IE浏览器的缓存问题
    tomcat和jdk版本兼容问题。
    Java中的索引和数据库的索引区别
    Eclipse 连接Oracle 11g 时报ORA-12505错误的解决办法
    Tomcat 8 & JNDI Datasource
    【LeetCode】019. Remove Nth Node From End of List
    【前端UI框架】EasyUI
    装饰者模式
    【LeetCode】234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/renxiaoren/p/5125094.html
Copyright © 2011-2022 走看看