原创

java Jsoup详解(html格式化 html解析 java爬虫)

作者:cndz 围观群众:633 更新于 标签:html格式化html解析java爬虫jsoup详解

简介

Jsoup是一款Java HTML解析器,它可以从HTML文档中提取数据。它提供了一种简单的API,可以通过CSS选择器和类似于jQuery的语法来查找、提取和操作数据。Jsoup多用于java爬虫、html解析、html格式化等。在本文中,我们将深入了解Jsoup的一些基础用法和特性。

引入

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

主要功能

html格式化

官方说明里,一个重要的功能就是output tidy HTML,其中dity HTML的主要包括 换行、缩进、标签闭合。

  • 换行: 块级标签习惯上都会独占一行
  • 缩进: 根据HTML标签嵌套层数,行首缩进会不同
  • 严格的闭合标签: 如果是可以自闭合的标签并且没有内容,则进行自闭合

我们看下代码实例,使用jsoup格式化功能,输入信息如下:

    public static void main(String[] args) {
        String html = "<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\"><meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"><title>Document</title></head><body><p>这个标签没有闭合 <div>这个标签没有换行</div> <table><tr><td>标签错误没有tbody标签</td></tr></body></html>";
        Document parse = Jsoup.parse(html);
        System.out.println(parse.toString());
    }

下面是运行结果

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
 </head>
 <body>
  <p>这个标签没有闭合 </p>
  <div>
   这个标签没有换行
  </div> 
  <table>
   <tbody>
    <tr>
     <td>标签错误没有table标签</td>
    </tr>
   </tbody>
  </table>
 </body>
</html>

我们可以看到格式化后的代码没有闭合的标签闭合了,没有换行的块标签换行了,而且格式化后的代码自动缩进了。

html解析

要使用Jsoup解析HTML文档,我们需要先获取该文档。Jsoup提供了两种方法来获取HTML文档,分别是从URL和从本地文件获取。

// 从URL获取HTML文档
Document doc = Jsoup.connect("http://www.baidu.com").get();

// 从本地文件获取HTML文档
File input = new File("example.html");
Document doc = Jsoup.parse(input, "UTF-8");

其中,Jsoup.connect()方法用于从URL获取HTML文档,Jsoup.parse()方法用于从本地文件获取HTML文档。

获取HTML文档后,我们就可以使用Jsoup提供的API来解析文档了。以下是一些常用的解析方法:

Jsoup提供了多种方法来获取元素,其中最常用的是使用CSS选择器。以下是一些示例:

// 获取所有<a>元素
Elements links = doc.select("a");

// 获取所有带有href属性的<a>元素
Elements links = doc.select("a[href]");

// 获取所有class为"header"的元素
Elements headers = doc.select(".header");

// 获取所有id为"logo"的元素
Element logo = doc.select("#logo").first();

要获取元素的属性值,可以使用Element.attr()方法。以下是一个示例:

// 获取第一个<a>元素的href属性值
String linkHref = links.first().attr("href");

要获取元素的文本,可以使用Element.text()方法。以下是一个示例:

// 获取第一个<a>元素的文本
String linkText = links.first().text();

代码实例:获取一个文本中所有不带有 rel=”nofollow”属性的a标签。

         try {
            document = Jsoup.connect("http://www.baidu.com").get();
        } catch (IOException e) {
            e.printStackTrace();
            log.info("链接抓取失败");
        }
        //使用select获取所有的a标签
        Elements links = Jsoup.parse(document.outerHtml()).select("a");
        // 使用循环遍历每个标签数据
        for (Iterator<Element> it = links.iterator(); it.hasNext(); ) {
            Element e = (Element) it.next();
            String qUrl = e.attr("href");
            //如果rel属性是nofollow的话continue;
            if (StringUtils.equals(e.attr("rel"), "nofollow")) {
                continue;
            }
            //可以使用e.text()输入a标签的文本。
            allUrls.add(qUrl);

        }
        return allUrls;

除了解析HTML文档外,Jsoup还提供了一些方法来处理HTML文本。以下是一些常用的方法:

要清除HTML文本中的所有标签,可以使用Jsoup.parse()方法,并使用text()方法获取文本。以下是一个示例:

// 清除HTML标签
String cleanText = Jsoup.parse(html).text();

要过滤HTML文本中的指定标签,可以使用Whitelist类。以下是一个示例:

// 过滤HTML标签
String safe = Jsoup.clean(unsafe, Whitelist.basic());

其中,unsafe为原始HTML文本,safe为过滤后的HTML文本。

代码实例:

    public static void main(String[] args) throws IOException {
        String html = "<!doctype html>\n" +
                "<html lang=\"en\">\n" +
                " <head>\n" +
                "  <meta charset=\"UTF-8\">\n" +
                "  <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n" +
                "  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n" +
                "  <title>Document</title>\n" +
                " </head>\n" +
                " <body>\n" +
                "  <p>测试段落 </p>\n" +
                "  <div>测试div</div>\n" +
                "  <b>张三</b>\n" +
                "  </table>\n" +
                " </body>\n" +
                "</html>";
        Whitelist whitelist = new Whitelist();
        whitelist.addTags("div");
        String clean = Jsoup.clean(html, whitelist);
        System.out.println(clean);
    }

过滤结果

jsoup爬虫

其实爬虫说白了就是组合上边的那些方法。按照某种规律来抓取往上的信息。这里就不过多赘述了。

结论

Java Jsoup是一款功能强大的HTML解析器,它可以帮助我们轻松地从HTML文档中提取数据。在本文中,我们介绍了一些基础用法和特性,希望可以帮助读者更好地使用Jsoup。