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

如果覺得我的文章對您有幫助,請予以打賞。您的支持將鼓勵我繼續創作!謝謝!
微信打賞
支付寶打賞


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM