目的

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

html解析器

jsoup

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

htmlparser

提供了线性和嵌套两种方式来解析网页,主要用于 html 网页的转换(Transformation) 以及网页内容的抽取 (Extraction)。

jsoup和htmlparser对比

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;/*** 获取连接,写出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">// </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");}@Testpublic 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());}@Autowiredprivate FreeMarkerConfigurer freeMarkerConfigurer;@Testpublic 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")));}}

如果感觉不错的话记得点赞哟!!!

Spring Boot html页面解析之jsoup相关推荐

  1. spring boot 源码解析23-actuate使用及EndPoint解析

    前言 spring boot 中有个很诱人的组件–actuator,可以对spring boot应用做监控,只需在pom文件中加入如下配置即可: <dependency><group ...

  2. Spring/Spring Boot错误页面处理的多种方式(404 not found等)

    Spring/Spring Boot错误页面处理的多种方式(404 not found等) 简单来说, tomcat容器会根据error-page的内容forward到指定location(会再走一次 ...

  3. spring boot 源码解析31-AuthenticationAuditListener,AuthorizationAuditListener

    前言 这篇文章我们来分析一下org.springframework.boot.actuate.security,org.springframework.boot.actuate.audit中的代码,这 ...

  4. Spring Boot配置视图解析器

    2019独角兽企业重金招聘Python工程师标准>>> 在SpringBoot中,视图解析器的配置可以参考 Spring Boot数据源配置 #方式一:直接在属性文件中,加入 spr ...

  5. springboot 获取application参数_(最新 9000 字 )Spring Boot 配置特性解析

    一.概述 目前Spring Boot版本: 2.3.4.RELEASE,这更新的速度也是嗖嗖的了,随着新版本的发布,也一步步针对公司基础组件进行了升级改造,其中很重要的一块就是配置文件的更新(虽然目前 ...

  6. spring boot 源码解析52-actuate中MVCEndPoint解析

    前言 之前的几篇文章分析了spring boot 中有关endpoint的实现,细心的朋友可以发现,在org.springframework.boot.actuate.endpoint.mvc 包下也 ...

  7. spring boot 源码解析15-spring mvc零配置

    前言 spring boot 是基于spring 4 的基础上的一个框架,spring 4 有一个新特效–>基于java config 实现零配置.而在企业的实际工作中,spring 都是和sp ...

  8. spring boot 源码解析43-JmxMetricWriter详解

    前言 本文我们来介绍JmxMetricWriter, JmxMetricWriter是依赖于spring jmx 来实现的. 因此本文的开头先介绍一下spring boot 与jmx的集成,然后分析J ...

  9. spring boot 源码解析29-LogbackLoggingSystem

    前言 现在我们来分析一下LogbackLoggingSystem,spring boot 中默认生效的,该类也是继承自Slf4JLoggingSystem. 解析 LogbackLoggingSyst ...

最新文章

  1. hdu4560 不错的建图,二分最大流
  2. websocket之二:WebSocket编程入门
  3. 高通平台msm8909 LK 实现LCD 兼容
  4. 程序员的能力矩阵表【转载自】
  5. Android窗口View层次
  6. Ubuntu 华为开源镜像站 Mirror
  7. html折叠菜单列子,基于Vue.js+bootstrap4的左侧可伸缩式菜单
  8. InfluxDB的HTTP API写入操作
  9. python找出只出现一次的数字_【LeetCode 136】只出现一次的数字(Python)
  10. Bailian2698 八皇后【回溯】
  11. #JS 窗口resize避免触发多次
  12. zepto 操作 cookie
  13. lora三层服务器协议,LoRa以及LoRa包含的几种协议
  14. QQ游戏连连看的脚本
  15. vue实现预览pdf组件(vue-pdf插件使用)
  16. teamspeak3快速安装
  17. UX设计师是做什么的,现在怎么样
  18. php面试题之二——数据结构和算法(高级部分)
  19. 押宝ACE平台 北电自救或转身服务型公司
  20. 花旗杯决赛第二 + 最佳移动应用

热门文章

  1. java 获取oracle表结构_获取Oracle中所有表的列表?
  2. vue数组修改不触发视图更新、vue向响应式对象添加或删除属性
  3. Vue-cli项目中mockjs + axios实现前后端分离代码demo(清晰易懂)
  4. Java中使用有返回值的线程
  5. java 雅思_基于JAVA的雅思考试管理系统的设计与实现(SSH,MySQL)(含录像)
  6. promise链式调用_这一次,彻底弄懂 Promise
  7. 关于引入 js 文件
  8. LeetCode.31 下一个排列
  9. MySQL建立多选一列表_如何实现自定义列表的多个item,的单选或多选
  10. python删除一个文件_Python 实现一个小功能: 删除某路径下文件及文件夹的脚本...