1. 程式人生 > >爬完杭電課表的後事(1)

爬完杭電課表的後事(1)

今天早上不把這幾天沒發的朋友圈補回來就不出門了。

杭電學生成績頁HTML解析

第二篇部落格裡的程式碼返回的是一串html程式碼,也就是個字串,java處理字串真的感動的不行。這是第一次接觸正則表示式,以前看到了就拿去寫寫,匹配一下感覺還不錯,然後就這幾個返回的字串拿來練正則舒服的不行。

下面的程式碼主要的思路是得到爬蟲返回的程式碼以後,用正則表示式匹配出第一個formList裡含有的學生的相關資訊,主要是學號、姓名、學院、專業、行政班級,程式碼中因為涉及到個人資訊所以稍微修改了一下。關於成績的匹配,因為之前選擇課表的時候是按照列解析,所以這次成績按行來解析讀取,沒想到效果是異常的舒服啊,不過也正常,課表和成績的顯示不太一樣。這裡因為對於成績的格式化有一點重複性,就懶得再寫了。如果有需要的話可以參照下一篇部落格的lesson內的匹配。

package parseHTML;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class ScoreParser {
	
	static Student stu;
	
	static final String NAMEPATTERN = "\\u59d3\\u540d:([\\u4e00-\\u9fa5]*)";
	static final String IDPATTERN = "\\u5b66\\u53f7:([0-9]*)";
	static final String ACADEMYPATTERN = "\\u5b66\\u9662:([\\u4e00-\\u9fa5]*)";
	static final String MAJORPATTERN = "\\u4e13\\u4e1a:([\\u4e00-\\u9fa5]*)";
	static final String CLASSPATTERN = "\\u884c\\u653f\\u73ed:([0-9]*)";
	static final String SEMESTERPATTERN = "[0-9]{4}-[0-9]{4}[\\u5b66\\u5e74\\u7b2c]+[1|2][\\u5b66\\u671f\\u5b66\\u4e60\\u6210\\u7ee9]+";
	
	private static String findStudentName(String formlist) {
		Pattern p = Pattern.compile(NAMEPATTERN);
		Matcher m = p.matcher(formlist);
		if(m.find()) {
			return m.group(1);
		}
		return null;
	}
	
	private static String findStudentID(String formlist) {
		Pattern p = Pattern.compile(IDPATTERN);
		Matcher m = p.matcher(formlist);
		if(m.find()) {
			return m.group(1);
		}
		return null;
	}
	
	private static String findMajor(String formlist) {
		Pattern p = Pattern.compile(MAJORPATTERN);
		Matcher m = p.matcher(formlist);
		if(m.find()) {
			return m.group(1);
		}
		return null;
	}
	
	private static String findAcademy(String formlist) {
		Pattern p = Pattern.compile(ACADEMYPATTERN);
		Matcher m = p.matcher(formlist);
		if(m.find()) {
			return m.group(1);
		}
		return null;
	}
	
	private static String findClass(String formlist) {
		Pattern p = Pattern.compile(CLASSPATTERN);
		Matcher m = p.matcher(formlist);
		if(m.find()) {
			return m.group(1);
		}
		return null;
	}
	
	private static String findSemester(String formlist) {
		Pattern p = Pattern.compile(SEMESTERPATTERN);
		Matcher m = p.matcher(formlist);
		if(m.find()) {
			return m.group(0);
		}
		return null;
	}
	
	private static void parseFormList(String formlist){
		Document doc = Jsoup.parse(formlist);
		// 根據id獲取table
		Elements td = doc.getElementsByClass("formlist");
		String td_text = td.text();
//		System.out.println(td_text);
		stu = new Student(findStudentName(td_text), findStudentID(td_text), findAcademy(td_text), findMajor(td_text), findClass(td_text), findSemester(td_text));
		System.out.println(findSemester(td_text));
		stu.showAll();
	}
	
	private static void parseDataList(String datalist) {
		Document doc = Jsoup.parse(datalist);
		Elements td = doc.getElementsByTag("tr");
		for(int i=0;i<td.size();i++) {
			System.out.println(td.get(i).text());
		}
	}
	
	
	public static void main(String args[]) {
		String formlist = "<table class=\"formlist\" id=\"tbXsxx\"><tr><td align=\"center\" colspan=\"3\" style=\"font-size:18px; font-weight:900;  \">2017-2018學年第1學期學習成績</td></tr><tr><td>學號:1612345</td><td>姓名:丟雷樓某</td><td>學院:保密學院</td></tr><tr><td colspan=\"2\">專業:保密</td><td>行政班:16123456</td></tr></table>";
		parseFormList(formlist);
		String datalist ="這裡本來是成績的html程式碼";
		parseDataList(datalist);
	}
}

下面是輸出結果:

student類就是很簡單的一個學生物件,只有set/get各個屬性的方法以及全部屬性的構造器,這裡就不貼程式碼了,早點寫完吃飯去了