当前位置:首页 > 技术文章 > 正文内容

Spring Boot集成jsoup实现html解析

arlanguage1周前 (04-27)技术文章4

1.什么是jsoup

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

JSoup 功能

jsoup 实现 WHATWG HTML5 规范,并将 HTML 解析为与现代浏览器相同的 DOM。

  • 从 URL,文件或字符串中提取并解析 HTML。
  • 查找和提取数据,使用 DOM 遍历或 CSS 选择器。
  • 操纵 HTML 元素,属性和文本。
  • 根据安全的白名单清理用户提交的内容,以防止 XSS 攻击。
  • 输出整洁的 HTML。

JSoup 主要类

大多数情况下,下面给出 3 个类是我们需要重点了解的。

Jsoup 类

Jsoup 类是任何 Jsoup 程序的入口点,并将提供从各种来源加载和解析 HTML 文档的方法。 Jsoup 类的一些重要方法如下:

方法

描述

static Connection connect(String url)

创建并返回 URL 的连接。

static Document parse(File in, String charsetName)

将指定的字符集文件解析成文档。

static Document parse(String html)

将给定的 html 代码解析成文档。

static String clean(String bodyHtml, Whitelist whitelist)

从输入 HTML 返回安全的 HTML,通过解析输入 HTML 并通过允许的标签和属性的白名单进行过滤。

Jsoup 类的其他重要方法可以参见 -
https://jsoup.org/apidocs/org/jsoup/Jsoup.html

Document 类

该类表示通过 Jsoup 库加载 HTML 文档。可以使用此类执行适用于整个 HTML 文档的操作。 Element 类的重要方法可以参见 -
http://jsoup.org/apidocs/org/jsoup/nodes/Document.html

Element 类

HTML 元素是由标签名称,属性和子节点组成。 使用 Element 类,您可以提取数据,遍历节点和操作 HTML。 Element 类的重要方法可参见 -
http://jsoup.org/apidocs/org/jsoup/nodes/Element.html

2.代码工程

实验目的

实现解析liuhaihua.cn首页list

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>jsoup</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

    </dependencies>
</project>

controller

package com.et.jsoup;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloWorldController {
    @RequestMapping("/hello")
    public Map<String, Object> showHelloWorld(){
        Map<String, Object> map = new HashMap<>();
        map =JsoupUtil.parseHtml("http://www.liuhaihua.cn/");
        map.put("msg", "HelloWorld");
        return map;
    }
}

工具类

package com.et.jsoup;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * @author liuhaihua
 * @version 1.0
 * @ClassName JsoupUtil
 * @Description todo
 * @date 2024/06/24/ 9:16
 */

public class JsoupUtil {
        public static Map<String ,Object> parseHtml(String url){
            Map<String,Object> map = new HashMap<>();
            //1.生成httpclient,相当于该打开一个浏览器
            CloseableHttpClient httpClient = HttpClients.createDefault();
            CloseableHttpResponse response = null;
            //2.创建get请求,相当于在浏览器地址栏输入 网址
            HttpGet request = new HttpGet(url);
            //设置请求头,将爬虫伪装成浏览器
            request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
//        HttpHost proxy = new HttpHost("60.13.42.232", 9999);
//        RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
//        request.setConfig(config);
            try {
                //3.执行get请求,相当于在输入地址栏后敲回车键
                response = httpClient.execute(request);

                //4.判断响应状态为200,进行处理
                if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    //5.获取响应内容
                    HttpEntity httpEntity = response.getEntity();
                    String html = EntityUtils.toString(httpEntity, "utf-8");
                    System.out.println(html);

                    /**
                     * 下面是Jsoup展现自我的平台
                     */
                    //6.Jsoup解析html
                    Document document = Jsoup.parse(html);
                    //像js一样,通过标签获取title
                    System.out.println(document.getElementsByTag("title").first());
                    Elements blogmain = document.getElementsByClass("col-sm-8 blog-main");


                    //像js一样,通过class 获取列表下的所有博客
                    Elements postItems =  blogmain.first().getElementsByClass("fade-in");
                    //循环处理每篇博客
                    List<Map>  list =  new ArrayList<>();
                    for (Element postItem : postItems) {
                        Map<String,Object> row = new HashMap<>();
                        //像jquery选择器一样,获取文章标题元素
                        Elements titleEle = postItem.select(".entry-title a");
                        System.out.println("文章标题:" + titleEle.text());;
                        row.put("title",titleEle.text());
                        System.out.println("文章地址:" + titleEle.attr("href"));
                        row.put("href",titleEle.attr("href"));
                        //像jquery选择器一样,获取文章作者元素
                        Elements footEle = postItem.select(".archive-content");
                        System.out.println("文章概要:" + footEle.text());;
                        row.put("summary",footEle.text());
                        Elements view = postItem.select(".views");
                        System.out.println( view.text());
                        row.put("views",view.text());
                        System.out.println("*********************************");
                        list.add(row);
                    }
                    map.put("data",list);

                } else {
                    //如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
                    System.out.println("返回状态不是200");
                    System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
                }

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //6.关闭
                HttpClientUtils.closeQuietly(response);
                HttpClientUtils.closeQuietly(httpClient);
            }
            return  map;
        }
        public static void main(String[] args) {
            parseHtml("http://www.liuhaihua.cn/");
        }

}

DemoApplication.java

package com.et.jsoup;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo

3.测试

  • 启动spring boot应用
  • 访问http://127.0.0.1:8088/hello,返回解析结果

4.引用

  • 官网:https://jsoup.org/
  • GitHub:https://github.com/jhy/jsoup/
  • http://www.liuhaihua.cn/archives/710776.html

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/4173.html

分享给朋友:

“Spring Boot集成jsoup实现html解析” 的相关文章

Linux中内网或者没网时安装软件的两种方式

写在前面对于可以连接外网的服务器装软件,只要配置yum源就可以随便使用了但是对于内网来说,不能连接外网,一般情况下,管控平台只有上传的权限。尤其是一些涉密的岗位,比如电力,电信,军工之类的。今天和小伙伴聊聊内网服务器如何安装软件的问题。可事实是,唯恐暴露才华不足的卑怯的畏惧,和厌恶钻研刻苦的惰怠,就...

nginx 解决 readv() failed (104: Connection reset by peer)

查看nginx error错误,发现上传接口报以下错:2019/10/10 19:58:25 [error] 299784#0: *5967188 readv() failed (104: Connection reset by peer) while reading upstream, clien...

Nginx系列:图片过滤处理

http_image_filter_module是Nginx提供的集成图片处理模块,支持nginx-0.7.54以后的版本,在网站访问量不是很高;磁盘有限不想生成多余的图片文件的前提下,就可以用它实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息,由于是实时计算的结果,所以网站...

Nginx 的日志 nginx的日志能否保存到日志审计里面?

Nginx 的日志主要有 2 个,一个是 access.log, 一个是 error.log。如果你不进行任何配置的话,这 2 个日志将会使用默认的日志配置,这个日志将会位于/var/log/nginx 目录中。针对虚拟主机的配置如果你使用了 Nginx 为虚拟主机的话。那么你可以在你的虚拟主机的配...

在AWS上组合使用ELB和Nginx Plus获得更多特性

使用AWS的客户经常问我们,对于负载均衡,到底是使用AWS的ELB还是Nginx Plus?Amazon曾经发布了一个白皮书来说明如何在AWS上配置Nginx Plus。本文将聚焦在选择Nginx Plus或者ELB时需要考虑的因素方面,也会讨论一些更适合于组合使用Nginx Plus和ELB的情形...

http——使用Nginx部署HTTPS服务

https 服务部署使用 HTTPS 需要生成私钥与公钥;某个文件夹中打开 git bash 输入命令:openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout localhost-privkey.pem -out localhost-cer...