Spring Boot 系列教程11-html页面解析-jsoup

时间:2022-09-06 23:07:56

需求

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

html解析器

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

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

Spring Boot 系列教程11-html页面解析-jsoup

项目图片

Spring Boot 系列教程11-html页面解析-jsoup

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

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

Spring Boot 系列教程11-html页面解析-jsoup

Spring Boot 系列教程11-html页面解析-jsoup

Spring Boot 系列教程11-html页面解析-jsoup的更多相关文章

  1. Spring Boot 系列教程8-EasyUI-edatagrid扩展

    edatagrid扩展组件 edatagrid组件是datagrid的扩展组件,增加了统一处理CRUD的功能,可以用在数据比较简单的页面. 使用的时候需要额外引入jquery.edatagrid.js ...

  2. Spring Boot 系列教程7-EasyUI-datagrid

    jQueryEasyUI jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要 ...

  3. Spring Boot 系列教程16-数据国际化

    internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...

  4. Spring Boot 系列教程15-页面国际化

    internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...

  5. Spring Boot 系列教程19-后台验证-Hibernate Validation

    后台验证 开发项目过程中,后台在很多地方需要进行校验操作,比如:前台表单提交,调用系统接口,数据传输等.而现在多数项目都采用MVC分层式设计,每层都需要进行相应地校验. 针对这个问题, JCP 出台一 ...

  6. Spring Boot 系列教程18-itext导出pdf下载

    Java操作pdf框架 iText是一个能够快速产生PDF文件的java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好 ...

  7. Spring Boot 系列教程17-Cache-缓存

    缓存 缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找.由于缓存的运行速度比内存快得多,故缓存的作用就是帮 ...

  8. Spring Boot 系列教程14-动态修改定时任务cron参数

    动态修改定时任务cron参数 不需要重启应用就可以动态的改变Cron表达式的值 不能使用@Scheduled(cron = "${jobs.cron}")实现 DynamicSch ...

  9. Spring Boot 系列教程12-EasyPoi导出Excel下载

    Java操作excel框架 Java Excel俗称jxl,可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件,现在基本没有更新了 http://jxl.sourcef ...

随机推荐

  1. LeetCode Find All Anagrams in a String

    原题链接在这里:https://leetcode.com/problems/find-all-anagrams-in-a-string/ 题目: Given a string s and a non- ...

  2. go&lowbar;databasetest

    go_databasetest go语言的数据库测试: go get github.com/Go-SQL-Driver/MySQL package main import ( _"githu ...

  3. 调用&lbrace;dede&colon;likewords&rcub;为dedecms添加相关搜索词

    经常看到一些大型的网站会设置相关搜索,即使访客搜索的内容在本站暂时没有,它们也会展示一些其他搜索关键词,引导用户去点击查看,增加pv,提高用户体验:如果没有这些相关搜索,游客没有找到自己想要的内容就直 ...

  4. 关于Objective-C格式化处理相关规范

    Objective-C格式字符串和C#有很大的差别,下面我们就来看看 在C#中我们可以这么做,简单例举几个: //格式化输出字符串 string word = "world"; s ...

  5. 集合类学习之ArrayList源码解析

    1.概述 ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大 ...

  6. android 电容屏(一):电容屏基本原理篇

    平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博 ...

  7. UIViewCotroller 的生命周期函数

    Viewcontroller 的所有生命周期函数 重写时 一定要先写 父类 方法 就是(super  +生命周期函数) LoadView ViewDidLoad ViewDidUnload: 在iOS ...

  8. HOOK API(二)—— HOOK自己程序的 MessageBox

    HOOK API(二) —— HOOK自己程序的 MessageBox 0x00 前言 以下将给出一个简单的例子,作为HOOK API的入门.这里是HOOK 自己程序的MessageBox,即将自己程 ...

  9. &period;net卸载程序制作

    原文:.net卸载程序制作 方法一: 在打包项目中添加文件msiexec.exe(一般在c:\windows\system32(系统目录中)找到). 在文件系统视图中选择应用程序文件,在msiexec ...

  10. hack查询地址

    悲催的IE! http://browserhacks.com/