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

如果觉得我的文章或者代码对您有帮助,可以请我喝杯咖啡。
**您的支持将鼓励我继续创作!谢谢! **

微信打赏
微信打赏

支付宝打赏
支付宝打赏

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容