时不时会有断网开发的群友索要
依赖很少
java
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; import java.nio.charset.Charset;
pom
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-http</artifactId> <version>5.1.2</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-json</artifactId> <version>5.1.2</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.13.1</version> </dependency>
code
public static void main(String[] args) { try { String fileMode = ".."; String baseurl = "https://jfinal.com"; Document document = Jsoup.connect("https://jfinal.com/doc").get(); for (Element it : document.select(".jf-doc2.jf-doc-menus ul>li>a")) { String pageHref = it.attr("href"); String pageURL = baseurl + pageHref; Document documentx = Jsoup.connect(pageURL).get(); documentx.select(".jf-doc2.jf-doc-menus ul>li>a").forEach(itx -> { itx.attr("href", fileMode + itx.attr("href") + ".html"); }); Elements scripts = documentx.select("script"); for (Element script : scripts) { String src = script.attr("src"); String scriptText; if (StrUtil.isNotBlank(src)) { if (src.startsWith("http")) { if (!src.contains(".js")) { script.attr("src", "").remove(); } //scriptText = HttpUtil.get(src); } else { if (src.contains("jfinal-com-4.0.js")) { script.attr("src", "").remove(); continue; } src = src.substring(0, src.lastIndexOf(".js") + 3); if (!src.startsWith("/")) { System.out.println("非/开头的script"); System.out.println(src); } script.attr("src", fileMode + src); File file = new File("./jfinal", src); if (!file.exists()) { scriptText = HttpUtil.get(baseurl + src); try { FileUtil.writeString(scriptText, file, Charset.defaultCharset()); } catch (IORuntimeException e) { e.printStackTrace(); } } } } } scripts = documentx.select("link[type=\"text/css\"]"); for (Element link : scripts) { String href = link.attr("href"); String scriptText; if (StrUtil.isNotBlank(href)) { href = href.substring(0, href.lastIndexOf(".css") + 4); if (href.startsWith("http")) { String n = IdUtil.fastSimpleUUID(); String url = "/assets/css/" + n + ".css"; link.attr("href", fileMode + url); HttpUtil.downloadFile(href, new File("./jfinal", url)); } else { if (!href.startsWith("/")) { System.out.println("非/开头的style"); System.out.println(href); } link.attr("href", fileMode + href); File file = new File("./jfinal", href); if (!file.exists()) { File parent = file.getParentFile(); if (!parent.exists()) parent.mkdirs(); // 路径中包含小数点 , 会创建失败 scriptText = HttpUtil.get(baseurl + href); try { FileUtil.writeString(scriptText, file, Charset.defaultCharset()); } catch (IORuntimeException e) { System.out.println(href); e.printStackTrace(); } } } } } scripts = documentx.select("img"); for (Element img : scripts) { String src = img.attr("src"); if (StrUtil.isNotBlank(src)) { if (src.startsWith("http")) { String n = IdUtil.fastSimpleUUID(); String url = "/img/" + n + ".jpg"; img.attr("src", fileMode + url); HttpUtil.downloadFile(src, new File("./jfinal", url)); } else { img.attr("src", fileMode + src); File file = new File("./jfinal", src); File parent = file.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } HttpUtil.downloadFile(baseurl + src, new File("./jfinal", src)); } } } documentx.select(".doc-pre-next-box a").forEach(itx->{ itx.attr("href", fileMode + itx.attr("href") + ".html"); }); File file = new File("./jfinal", pageHref + ".html"); FileUtil.writeString(documentx.toString(), file, Charset.defaultCharset()); } } catch (IOException e) { e.printStackTrace(); } }
使用姿势, 新建maven工程, 项目根目录新建名为jfinal目录, 新建java类,粘贴运行main方法, 直接在浏览器打开