Jsoup

Jsoup

​ Jsoup是一款java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

jsoup主要功能

  1. 从一个URL,文件或字符串中解析HTML;
  2. 使用DOM或CSS选择器来查找,取出数据;
  3. 可操作HTML元素、属性、文本;

入门程序

解析url

1.导入依赖
 <!-- jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.13.1</version>
</dependency>
<!-- 测试 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
</dependency>
<!-- fileUtils -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.7</version>
</dependency>
<!-- StringUtils -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>
2.代码
@Test
    public void testUrl() throws Exception{
        //解析url地址
        //第一个参数:访问的url;第二个参数:访问的超时时间(单位:毫秒)
        Document document = Jsoup.parse(new URL("http://www.itcast.cn"), 1000);
        //使用标签选择器,获取title标签中的内容
        String title = document.getElementsByTag("title").first().text();
        System.out.println(title);
    }

解析字符串

@Test
    public void testString() throws Exception{
        //使用工具类读取文件,获取字符串
        String content = FileUtils.readFileToString(new File("C:\\Users\\888\\Desktop\\itcast.html"), "utf8");
        //解析字符串
        Document document = Jsoup.parse(content);
        String title = document.getElementsByTag("title").first().text();
        System.out.println(title);
    }

解析文件

  @Test
    public void testFile()throws Exception{
        //解析文件
        Document document = Jsoup.parse(new File("C:\\Users\\888\\Desktop\\itcast.html"), "utf8");
        String title = document.getElementsByTag("title").first().text();
        System.out.println(title);
    }

使用dom方式遍历文档

元素获取
  • 根据id查询元素getElementById
  • 根据标签获取元素getElementsByTag
  • 根据class获取元素getElementsByClass
  • 根据属性获取元素getElementsByAttribute
@Test
public void testDOM()throws Exception{
    //解析文件,获取Document对象
    Document document = Jsoup.parse(new File("C:\\Users\\888\\Desktop\\itcast.html"), "utf8");

    //        - 根据id查询元素getElementById
    Element myMessage = document.getElementById("myMessage");
    System.out.println("根据id获取元素:"+myMessage.text());
    //        - 根据标签获取元素getElementsByTag
    Elements elements = document.getElementsByTag("li");
    for (Element e :
         elements) {
        System.out.println("根据tag获取元素:"+e.text());
    }
    //        - 根据class获取元素getElementsByClass
    Elements elements1 = document.getElementsByClass("fl clear");
    for (Element e :
         elements1) {
        System.out.println("根据class获取元素:"+e.text());
    }
    //        - 根据属性获取元素getElementsByAttribute
    Element element = document.getElementsByAttributeValue("href", "/course").first();
    System.out.println("根据Attribute获取元素:"+element.text());
}
元素中获取数据
  • 从元素中获取id
  • 从元素中获取className
  • 从元素中获取属性的值attr
  • 从元素中获取所有属性attributes
  • 从元素中获取文本内容text
@Test
public void testData()throws Exception{
    //        元素中获取数据
    Document document = Jsoup.parse(new File("E:\\学习\\文件夹\\自学系列\\spider\\itcast.html"), "utf8");
    Element testDiv = document.getElementById("testDiv");
    //        - 从元素中获取id
    String id = testDiv.id();
    System.out.println("id:"+id);
    //        - 从元素中获取className
    Set<String> classNames = testDiv.classNames();
    for (String s:
         classNames) {
        System.out.println("类名:"+s);
    }
    //        - 从元素中获取属性的值attr
    String attrId = testDiv.attr("id");
    System.out.println("attrId:"+attrId);
    String attrClass = testDiv.attr("class");
    System.out.println("attrClass:"+attrClass);
    //        - 从元素中获取所有属性attributes
    Attributes attributes = testDiv.attributes();
    System.out.println("attributes:"+attributes.toString());
    //        - 从元素中获取文本内容text
    String content = testDiv.text();
    System.out.println("content:"+content);
}

Selector选择器

  • tagname:通过标签查找元素,比如:span
  • #id:通过ID查找元素,比如:#city_bj
  • .class:通过class名称查找元素,比如:.class_a
  • [attribute]:利用属性查找元素,比如:[abc]
  • [attr=value]:利用属性值来查找元素,比如:[class=s_name]
@Test
public void testSelector()throws Exception{

    //解析html文件
    Document document = Jsoup.parse(new File("E:\\学习\\文件夹\\自学系列\\spider\\itcast.html"), "utf8");
    //        - tagname:通过标签查找元素,比如:span
    Elements lis = document.select("li");
    for (Element element:lis){
        System.out.println("标签li:"+element.text());
    }
    //        - #id:通过ID查找元素,比如:#city_bj
    Elements select = document.select("#testDiv");
    System.out.println("通过ID查找元素:"+select.text());
    //        - .class:通过class名称查找元素,比如:.class_a
    Elements select1 = document.select(".fr");
    System.out.println("通过class名称查找元素:"+select1.get(0).text());
    //        - [attribute]:利用属性查找元素,比如:[abc]
    Elements select2 = document.select("[style]");
    System.out.println("利用属性查找元素:"+select2.first().text());
    //        - [attr=value]:利用属性值来查找元素,比如:[class=s_name]
    Elements select3 = document.select("[class=fr clearfix]");
    System.out.println("利用属性值来查找元素:"+select3.text());
}

Selector选择器组合使用

  • el#id:元素+ID,比如:h3#city_bj
  • el.class:元素+class,比如:li.class_a
  • el[attr]:元素+属性名,比如:span[abc]
  • 任意组合:比如:span[abc].s_name
  • ancestor child:查找某个元素下子元素,比如:.city_con li查找"city_con"下的所有li
  • parent>child:查找某个父元素下的直接子元素,比如:.city_con>ul>li查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li
  • parent>*:查找某个父元素下所有直接子元素
@Test
public void testSelector2()throws Exception{
    //解析html文件
    Document document = Jsoup.parse(new File("E:\\学习\\文件夹\\自学系列\\spider\\itcast.html"), "utf8");
    //        - el#id:元素+ID,比如:h3#city_bj
    Elements select = document.select("div#testDiv");
    System.out.println("元素+ID:"+select.text());
    //        - el.class:元素+class,比如:li.class_a
    Elements select1 = document.select("li.A");
    System.out.println("元素+class:"+select1.text());
    //        - el[attr]:元素+属性名,比如:span[abc]
    Elements select2 = document.select("li[class]");
    System.out.println("元素+属性名:"+select2.text());
    //        - 任意组合:比如:span[abc].s_name
    Elements select3 = document.select("li[class].A");
    System.out.println("任意组合:"+select3.text());
    //        - ancestor child:查找某个元素下子元素,比如:.city_con li查找"city_con"下的所有li
    Elements select4 = document.select(".fr li");
    System.out.println("查找某个元素下子元素:"+select4.first().text());
    //        - parent>child:查找某个父元素下的直接子元素,比如:.city_con>ul>li查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li
    Elements select5 = document.select(".fr>ul>li");
    System.out.println("查找某个父元素下的直接子元素:"+select5.first().text());
    //        - parent>*:查找某个父元素下所有直接子元素
    Elements select6 = document.select("div>*");
    System.out.println("查找某个父元素下所有直接子元素:"+select6.first().text());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值