zoukankan      html  css  js  c++  java
  • Spring Boot 系列教程11-html页面解析-jsoup

    需求

    • 需要对一个页面进行数据抓取,并导出doc文档

    html解析器

    • jsoup
    • 可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
    • htmlparser
    • 提供了线性和嵌套两种方式来解析网页,主要用于 html 网页的转换(Transformation) 以及网页内容的抽取 (Extraction)。
    • 比较一下
    • jsoup可以直接拿,类似jquery的选择器一样用起来比较好上手。htmlparser结构简单功能强大,难上手,但是自主度高

    准备doc文档并另存为xml文件

    这里写图片描述

    项目图片

    这里写图片描述

    pom.xml

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

    操作流程

    • 把xml文件修改名为Hibernate.ftl后拷贝文件到src/main/resources
    • 原来xml文件
    <w:body>
        <w:p>
            <w:pPr>
                <w:pStyle w:val="2" />
                <w:jc w:val="center" />
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                    <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                    <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                </w:rPr>
                <w:t>Hibernate</w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" w:ascii="微软雅黑" w:hAnsi="微软雅黑" w:eastAsia="微软雅黑" w:cs="微软雅黑" />
                    <w:b w:val="0" />
                    <w:i w:val="0" />
                    <w:caps w:val="0" />
                    <w:color w:val="555555" />
                    <w:spacing w:val="0" />
                    <w:sz w:val="21" />
                    <w:szCs w:val="21" />
                    <w:shd w:val="clear" w:color="auto" w:fill="FFFFFF" />
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:ascii="微软雅黑" w:hAnsi="微软雅黑" w:eastAsia="微软雅黑" w:cs="微软雅黑" />
                    <w:b w:val="0" />
                    <w:i w:val="0" />
                    <w:caps w:val="0" />
                    <w:color w:val="555555" />
                    <w:spacing w:val="0" />
                    <w:sz w:val="21" />
                    <w:szCs w:val="21" />
                    <w:shd w:val="clear" w:color="auto" w:fill="FFFFFF" />
                </w:rPr>
                <w:t>你还在为不知道怎样正确使用Hibernate而纠结吗</w:t>
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rFonts w:ascii="微软雅黑" w:hAnsi="微软雅黑" w:eastAsia="微软雅黑" w:cs="微软雅黑" />
                    <w:b w:val="0" />
                    <w:i w:val="0" />
                    <w:caps w:val="0" />
                    <w:color w:val="555555" />
                    <w:spacing w:val="0" />
                    <w:sz w:val="21" />
                    <w:szCs w:val="21" />
                    <w:shd w:val="clear" w:color="auto" w:fill="FFFFFF" />
                    <w:lang w:val="en-US" />
                </w:rPr>
                <w:t>,</w:t>
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" w:ascii="微软雅黑" w:hAnsi="微软雅黑" w:eastAsia="微软雅黑" w:cs="微软雅黑" />
                    <w:b w:val="0" />
                    <w:i w:val="0" />
                    <w:caps w:val="0" />
                    <w:color w:val="555555" />
                    <w:spacing w:val="0" />
                    <w:sz w:val="21" />
                    <w:szCs w:val="21" />
                    <w:shd w:val="clear" w:color="auto" w:fill="FFFFFF" />
                </w:rPr>
                <w:t>你还在为不知道怎样配置映射文件而郁闷吗</w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:pStyle w:val="3" />
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:t>Hibernate 系列教</w:t>
            </w:r>
            <w:bookmarkStart w:id="0" w:name="_GoBack" />
            <w:bookmarkEnd w:id="0" />
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:t>程1-枚举单例类</w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                    <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:fldChar w:fldCharType="begin" />
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:instrText xml:space="preserve"> HYPERLINK &quot;http://blog.csdn.net/je_ge/article/details/53234944&quot; </w:instrText>
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:fldChar w:fldCharType="separate" />
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rStyle w:val="7" />
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:t>http://blog.csdn.net/je_ge/article/details/53234944</w:t>
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:fldChar w:fldCharType="end" />
            </w:r>
        </w:p>
        <w:sectPr>
            <w:pgSz w:w="11906" w:h="16838" />
            <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0" />
            <w:cols w:space="720" w:num="1" />
            <w:docGrid w:type="lines" w:linePitch="312" w:charSpace="0" />
        </w:sectPr>
    </w:body>
    • 现在ftl文件修改地方
    <w:body>
        <w:p>
            <w:pPr>
                <w:pStyle w:val="2" />
                <w:jc w:val="center" />
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                    <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                    <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                </w:rPr>
                <w:t>${title}</w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" w:ascii="微软雅黑" w:hAnsi="微软雅黑" w:eastAsia="微软雅黑" w:cs="微软雅黑" />
                    <w:b w:val="0" />
                    <w:i w:val="0" />
                    <w:caps w:val="0" />
                    <w:color w:val="555555" />
                    <w:spacing w:val="0" />
                    <w:sz w:val="21" />
                    <w:szCs w:val="21" />
                    <w:shd w:val="clear" w:color="auto" w:fill="FFFFFF" />
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:ascii="微软雅黑" w:hAnsi="微软雅黑" w:eastAsia="微软雅黑" w:cs="微软雅黑" />
                    <w:b w:val="0" />
                    <w:i w:val="0" />
                    <w:caps w:val="0" />
                    <w:color w:val="555555" />
                    <w:spacing w:val="0" />
                    <w:sz w:val="21" />
                    <w:szCs w:val="21" />
                    <w:shd w:val="clear" w:color="auto" w:fill="FFFFFF" />
                </w:rPr>
                <w:t>${content}</w:t>
            </w:r>
        </w:p>
        <#list list as map> 
        <w:p>
            <w:pPr>
                <w:pStyle w:val="3" />
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:t>${map.title}</w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                    <w:lang w:val="en-US" w:eastAsia="zh-CN" />
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:fldChar w:fldCharType="begin" />
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:instrText xml:space="preserve"> HYPERLINK &quot;${map.title}&quot; </w:instrText>
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:fldChar w:fldCharType="separate" />
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rStyle w:val="7" />
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:t>${map.href}</w:t>
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rFonts w:hint="eastAsia" />
                </w:rPr>
                <w:fldChar w:fldCharType="end" />
            </w:r>
        </w:p>
        </#list>
        <w:sectPr>
            <w:pgSz w:w="11906" w:h="16838" />
            <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992"
                w:gutter="0" />
            <w:cols w:space="720" w:num="1" />
            <w:docGrid w:type="lines" w:linePitch="312" w:charSpace="0" />
        </w:sectPr>
    </w:body>

    JsoupTest

    package com.jege.spring.boot;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
    
    import freemarker.template.Template;
    
    /**
     * @author JE哥
     * @email 1272434821@qq.com
     * @description:获取连接,写出doc文件
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest()
    public class JsoupTest {
      // 读取博客信息的地址
      private final static String URL_ADDRESS = "http://blog.csdn.net/je_ge?viewmode=contents";
    
      // <h1>
      // <span class="link_title"><a href="/je_ge/article/details/53366556">
      // Spring Boot 系列教程9-swagger-前后端分离后的标准
      // </a></span>
      // </h1>
    
      private Elements getLinks() throws Exception {
        // 新版本需要设置浏览器头信息
        Document document = Jsoup.connect(URL_ADDRESS)
        .userAgent("Mozilla/5.0 (Windows NT 7.0; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0").get();
        return document.select("h1 a");
      }
    
      @Test
      public void testGetLinks() throws Exception {
        Elements links = getLinks();
        for (int i = links.size() - 1; i >= 0; i--) {
          Element link = links.get(i);
          String attr = link.attr("href");
          String linkText = link.text();
          System.out.println(linkText);
          System.out.println(attr);
        }
        System.out.println("size:" + links.size());
      }
    
      @Autowired
      private FreeMarkerConfigurer freeMarkerConfigurer;
    
      @Test
      public void writeHibernate() throws Exception {
        String title = "Hibernate 系列教程";
        String content = "Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。";
        Elements links = getLinks();
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        for (Element link : links) {
          String linkText = link.text();
          if (linkText.contains(title)) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("href", "http://blog.csdn.net/" + link.attr("href"));
        map.put("title", linkText.replaceAll(title, ""));
        list.add(map);
          }
        }
        Collections.reverse(list);
        System.out.println("size:" + links.size());
    
        freeMarkerConfigurer.getConfiguration().setClassForTemplateLoading(getClass(), "/");
        Template template = freeMarkerConfigurer.getConfiguration().getTemplate("Hibernate.ftl");
        Map<String, Object> root = new HashMap<String, Object>();
        root.put("title", title);
        root.put("content", content);
        root.put("list", list);
        template.process(root, new FileWriter(new File(title + ".doc")));
      }
    
    }
    

    其他关联代码

    源码地址

    https://github.com/je-ge/spring-boot

    如果觉得我的文章对您有帮助,请予以打赏。您的支持将鼓励我继续创作!谢谢!
    微信打赏
    支付宝打赏

  • 相关阅读:
    tensorflow源码资源,github
    数据挖掘实战
    Ansible--快速入门
    gRPC C#学习
    Linq之Expression高级篇(常用表达式类型)
    十大经典排序算法(动图演示)
    ASP.NET Web API 管道模型
    docker面试题和解答(一)
    浅谈委托和事件(一)
    面试题三
  • 原文地址:https://www.cnblogs.com/je-ge/p/6119983.html
Copyright © 2011-2022 走看看