爬完杭電課表的後事(1)
阿新 • • 發佈:2018-12-17
今天早上不把這幾天沒發的朋友圈補回來就不出門了。
杭電學生成績頁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各個屬性的方法以及全部屬性的構造器,這裡就不貼程式碼了,早點寫完吃飯去了