通过解析HTML页面来获取页面的资源:
1、使用正则表达式来获取到我们需要的标签以及标签里的内容,存入到一个容器里,此处我选择的是使用list
集合。
2、遍历list
集合【我选择的是使用迭代器遍历【注意的是使用迭代器时,一对{}
里只能出现一次next()
方法,否则会报错,显示找不到这个类的异常,这是因为两个next(),Java程序不知道要去找哪一个next。】】用一个String
字符串来存放,接着再对其进行切割,得到我们要创建的目录的文件名。
3、下载资源
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regexHtml {
public static void readhtml(String fileName, String fileurl) throws IOException {
File f = new File(fileName);
BufferedReader in = new BufferedReader(new FileReader(f));
String str = "";
String pattern = "<(link.*?|img.*?|script.*?)(src|href)=\"(.*?)\"";
Pattern p = Pattern.compile(pattern);
List<String> urlList = new ArrayList<>();
while ((str = in.readLine()) != null) {
Matcher regx = p.matcher(str);
while (regx.find()) {
urlList.add(regx.group(3));
}
}
//获取迭代器对象
ListIterator<String> it2 = urlList.listIterator();
//循环迭代集合中的所有元素
while (it2.hasNext()) {
//获取到多级文件目录的名字
String Durl = it2.next();
System.out.println("解析出来的文件路径:" + Durl);
//创建多级目录文件夹,path创建的目标路径
String path = fileurl + Durl;
File file = new File(path);
//如果路径不存在,新建
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
//获取到数组的最后一个元素作为文件名
String[] split = Durl.split("/");
System.out.println("下载" + split[split.length - 1] + "资源");
String fileName2 = split[split.length - 1];
String downloadUrl = "目标地址" + Durl; //如:www.baidu.com
String savePath = fileurl + Durl + "\\";
downloadFile(fileName2, downloadUrl, savePath);
}
}
//下载资源
public static boolean downloadFile(String fileName, String downloadUrl, String savePath) {
boolean result = false;
try {
//先判断文件是否存在
File file1 = new File(savePath + fileName);
if (file1.exists()) {
System.out.println("删除已存在的文件");
file1.delete();
}
long begin = System.currentTimeMillis();
URL url = new URL(downloadUrl);
File file = new File(savePath + fileName);
org.apache.commons.io.FileUtils.copyURLToFile(url, file);
long end = System.currentTimeMillis();
//System.out.println("文件下载耗时:" + (end - begin) / 1000 + "s");
//执行到此,说明文件下载完毕
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}