jsoup使用介绍

简介

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

Jsoup的主要功能有三部分组成:

  1. 从字符串,网页,本地文件等方式生成Documentn
  2. 在生成Doucment后,根据Dom和css或类似jquery的selector语法获取Element,然后再从Elements中获取节点属性、文本、html
  3. 对Element的进行操作,包括HTML的值、节点内容的值和设置节点属性的值

说明:对html的解析还有另外一个工具库——HTMLParser,该项目已经不在维护了。

使用示例

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.2</version>
</dependency>

1、生成document:

//从字符串生成document
public void parseDocumentFromString() {
        String html = "<html><head><title>First parse</title></head>"
                + "<body><p>Parsed HTML into a doc.</p></body></html>";
        Document doc = Jsoup.parse(html);
        logger.info("parseDocumentFromString content={}", doc);
}

//从url生成document
public void loadDocumentFromURL() {
        Document doc;
        try {
            doc = Jsoup.connect("https://www.baidu.com/").get();
            // 从document中获取title值
            String title = doc.title();
            logger.info("LoadDocumentFromURL title={}", title);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

//从文件生成document
public void loadDocumentFromFile() {
    URL fileUrl = LoadParseDocument.class.getResource("/test/loadDocumentFromFile.html");
    File input = new File(fileUrl.getFile());
    try {
            Document doc = Jsoup.parse(input, "UTF-8", "https://www.baidu.com/");
            logger.info("LoadDocumentFromFile content={}", doc);
    } catch (IOException e) {
            e.printStackTrace();
    }
}

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

未关闭的
<p>Lorem <p>Ipsum parses to <p>Lorem</p> <p>Ipsum</p>

2、获取Elements:

2.1)使用类似浏览器提供给js原生的api语法:

public void extractDataByDOM() throws IOException{
        Document doc = Jsoup.connect("https://www.baidu.com/").get();
        Element lg = doc.getElementById("lg");
        logger.info("getElementById lg = {}", lg);
        Elements links = doc.getElementsByTag("a");
        for (Element link : links) {
          String linkHref = link.attr("href");
          String linkText = link.text();
          logger.info("linkHref={}, linkText={}",linkHref, linkText);
        }
}

2.2)使用类似jquery语法:

public void extractDataByCSSOrJqueryLikeSelectorSyntax() throws IOException{
        URL fileUrl = LoadParseDocument.class.getResource("/com/hry/tool/jsoup/extractingdata/extractDataByCSSOrJqueryLikeSelectorSyntax.html");
        File input = new File(fileUrl.getFile());
        Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

        // 获取所有的a节点
        Elements links = doc.select("a[href]"); 
        logger.info("links = {}", links);

        // 获取img的src以.png结果结尾
        Elements pngs = doc.select("img[src$=.png]");
        logger.info("pngs = {}", pngs);

        // 获取class=masthead的div节点
        Element masthead = doc.select("div.masthead").first();
        logger.info("masthead = {}", masthead);

        // 获取class=r的h3节点下面的a节点
        Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
        logger.info("resultLinks = {}", resultLinks);
}

3、获取属性、文本、html:

public void extractAttributesTextAndHTML(){
        String html = "<p>An <a href='/abc'><b>example</b></a> link.</p>";
        // 指定baseUri的值,在使用abs:attr会使用到
        Document doc = Jsoup.parse(html, "http://example.com/");
        Element link = doc.select("a").first();

        /**
         * text获取所有子节点的文本并组合在一一起
         * 如:HTML <p>Hello <b>there</b> now! </p>, --》 调用p.text() --》输出: "Hello there now!"
         */
        String text = doc.body().text(); // "An example link"
        logger.info("text={}", text);

        // 获取link的href属性值
        String linkHref = link.attr("href"); // /abc
        // 在href前面加上abs,会在现有的href(如/abc)的前面别上Jsoup.parse(html, "http://example.com/")里指定的baseUri值
        String absLinkHref = link.attr("abs:href"); // http://example.com/abc
        logger.info("linkHref={}, absLinkHref={}",linkHref, absLinkHref);

        // 获取link里所有字节点的内容组合在一起
        String linkText = link.text(); // "example""
        logger.info("linkText={}", linkText);

        // 获取本节点所有HTML文本信息
        String linkOuterH = link.outerHtml(); // "<a href="http://example.com"><b>example</b></a>"
        logger.info("linkOuterH={}", linkOuterH);

        // 获取本节点字节点的html文本信息
        String linkInnerH = link.html(); // "<b>example</b>"
        logger.info("linkInnerH={}", linkInnerH);
    }
}

4、设置值:

  • Element.text: 完全替换内容
  • Element.prepend:在节点的内容最前面加内容
  • Element.append:在节点的内容最后面加内容
public void setHTMLofAnElement() throws IOException{
    Document doc = getDoucment();

    // 获取div节点
    Element div = doc.select("div").first(); // <div></div>
    // 使用新的HTML替换div旧的html值
    div.html("<p>lorem ipsum</p>"); // <div><p>lorem ipsum</p></div>
    // 将新html添加到div内部的最前面
    div.prepend("<p>First</p>"); // <div><p>First</p><p>lorem ipsum</p></div>
    // 将新html添加到div内部的最后面
    div.append("<p>Last</p>");  // now: <div><p>First</p><p>lorem ipsum</p><p>Last</p></div>
    logger.info("now div={}", div);

    Element span = doc.select("span").first(); // <span>One</span>
    // 将span节点封装到html最里面 --》 <li><a href="http://example.com"><span>One</span></a></li>
    span.wrap("<li><a href='http://example.com/'></a></li>");

    logger.info("doc={}", doc);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值