最近好像老是跟读写操作打交道。。。。第一份工作第一件要做的事居然就是从静态网页上抓取数据,并写成csv格式。。因此,特意写一篇博客,纪念一下。。
首先从静态网页抓取数据,其实这个很简单,先贴下代码:
URL url = null;
HttpURLConnection conn = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
url = new URL(urlString);
conn = (HttpURLConnection) url.openConnection();
isr = new InputStreamReader(conn.getInputStream()); //BufferedReader每次读取一行字符,而InputStreamReader一次读取一个字节,各种流的详情请看 https://www.cnblogs.com/redick/p/6644594.html(不知道是哪位道友奉献的,盗用了实在不好意思。。。)
br = new BufferedReader(isr);
} catch (Exception e) {
e.printStackTrace();
}
此处的urlConnection对象实际上是根据URL的请求协议(此处是http)生成的URLConnection类
的子类HttpURLConnection,故此处最好将其转化为HttpURLConnection类型的对象。
接下来就是写了,先贴代码:
public static void write(String urlString, String filePath, String[] head,
boolean flag) {
int count = 0;
StringBuffer html = new StringBuffer();
try {
File outFile = new File(filePath); //首先定义文件路径,比如:C:/Users/Desktop/zcx/data.csv
BufferedWriter writer = null;
BufferedReader br = getData(urlString); //上面那个方法为getData()
if (flag) { //flag用来区分是在原来文件上追加还是直接覆盖原来的文件
writer = new BufferedWriter(new FileWriter(outFile));//上面这个加了一个缓冲,缓冲写满后在将数据写入硬盘这样做极大的提高了性能 ,如果不用缓冲,就会读一次写一次,性能会很差。
for (int i = 0; i < head.length; i++) {
writer.write(head[i].toString() + ",");
}
writer.newLine(); //写完表头后换行
} else {
writer = new BufferedWriter(new FileWriter(outFile, true));//这里跟上面那行相比多了true,代表在原文件上追加
}
String line;
if (br == null) {
System.exit(0);
}
while ((line = br.readLine()) != null) { // Just read a line every time.
html.append(line);
}
Pattern p = Pattern.compile("<td.*?/td>");//正则表达式,匹配条件为所有带有<td></td>的字符串
Matcher m = p.matcher(html); //在html中匹配
while (m.find()) { //boolean find() 对字符串进行匹配,匹配到的字符串可以在任何位置.
String tmp = m.group(); //group()返回匹配到的子字符串
tmp = tmp.replaceAll("</?[a-zA-Z]+[^><]*>", "");//给匹配成功的字符串去掉所有的样式及标签,只留下数据
if (tmp.contains(",") || tmp.contains(" ")) {
tmp = "\"" + tmp + "" + "\""; //如果数据中存在“,”,就会出现一个格子分成多个格子的情况,因为“,”是分隔符,解决办法就是将数据整体用“ ”双引号括起来。
tmp = new String(tmp.getBytes()).replaceAll("\\ ", ""); //如果数据为空,就会以“ ;”的形式出现,解决办法就是,使用转义符
}
tmp += ","; //所有的数据用逗号隔开,逗号即为分隔符,写入文件会以这个来分隔
writer.write(tmp); //将匹配到的数据处理后一个个写入文件
count++;
if (count % head.length == 0) { //每隔表头个元素就换行
writer.newLine(); // change to next line
}
}
writer.close(); //重中之重,如果掉了就无法写文件,因为我们使用了缓冲Bufferwriter,数据是先写到缓冲之后再写入硬盘的,因此,如若不关闭,是不会写入硬盘的!!!
} catch (Exception e) {
e.printStackTrace();
}
}
以上就是本仙女入职之后的第一个小任务,如若有错误,还请各位道友不吝赐教呀。。。。手动笔芯。。。
xml解析:https://blog.csdn.net/sdksdk0/article/details/51555090