From 43d3b11fb49dd2e374cff8e8bea788e0e035d68e Mon Sep 17 00:00:00 2001 From: lensferno Date: Tue, 22 Nov 2022 10:48:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A0=94=E7=A9=B6=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=BB=A9=E8=8E=B7=E5=8F=96/=E8=A7=A3=E6=9E=90=20refact:=20?= =?UTF-8?q?=E9=83=A8=E5=88=86jsoup=E5=85=83=E7=B4=A0=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E7=A7=BB=E8=87=B3=E7=8B=AC=E7=AB=8B=E7=9A=84JsoupUtil=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/linghang/mywust/core/api/Graduate.java | 2 + ...er.java => GraduateCourseTableParser.java} | 2 +- .../postgraduate/GraduateExamInfoParser.java | 40 ++++++++++++ .../GraduateStudentInfoPageParser.java | 63 ++++--------------- .../parser/undergraduate/ExamInfoParser.java | 31 +++++---- .../graduate/GraduateRequestFactory.java | 4 ++ .../linghang/mywust/core/util/JsoupUtil.java | 57 +++++++++++++++++ 7 files changed, 133 insertions(+), 66 deletions(-) rename mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/{GraduateCourseTablePageParser.java => GraduateCourseTableParser.java} (98%) create mode 100644 mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateExamInfoParser.java create mode 100644 mywust-core/src/main/java/cn/linghang/mywust/core/util/JsoupUtil.java diff --git a/mywust-core/src/main/java/cn/linghang/mywust/core/api/Graduate.java b/mywust-core/src/main/java/cn/linghang/mywust/core/api/Graduate.java index 72d1c8d..1e30ecc 100644 --- a/mywust-core/src/main/java/cn/linghang/mywust/core/api/Graduate.java +++ b/mywust-core/src/main/java/cn/linghang/mywust/core/api/Graduate.java @@ -6,4 +6,6 @@ public class Graduate { public static final String GRADUATE_STUDENT_INFO_API = "http://59.68.177.189/pyxx/grgl/student_info1.aspx"; public static final String GRADUATE_COURSE_TABLE_API = "http://59.68.177.189/pyxx/pygl/kbcx_xs.aspx"; + public static final String GRADUATE_SCORE_API = "http://59.68.177.189/pyxx/grgl/xskccjcx.aspx"; + public static final String GRADUATE_TRAINING_PLAN_PAGE_API = "http://59.68.177.189/pyxx/pygl/pyjhcx.aspx"; } diff --git a/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateCourseTablePageParser.java b/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateCourseTableParser.java similarity index 98% rename from mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateCourseTablePageParser.java rename to mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateCourseTableParser.java index c70197b..f59002d 100644 --- a/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateCourseTablePageParser.java +++ b/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateCourseTableParser.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class GraduateCourseTablePageParser implements Parser> { +public class GraduateCourseTableParser implements Parser> { private static final Pattern COURSE_TABLE_REGEX = Pattern.compile("课程:(?.*?)
班级:(?.*?)
\\((?.*?)\\)
(?.*?)
(?
.*?)
主讲教师:(?.*?)
"); diff --git a/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateExamInfoParser.java b/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateExamInfoParser.java new file mode 100644 index 0000000..1a9b92e --- /dev/null +++ b/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateExamInfoParser.java @@ -0,0 +1,40 @@ +package cn.linghang.mywust.core.parser.postgraduate; + +import cn.linghang.mywust.core.exception.ParseException; +import cn.linghang.mywust.core.parser.Parser; +import cn.linghang.mywust.model.global.ExamInfo; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.List; + +public class GraduateExamInfoParser implements Parser> { + @Override + public List parse(String html) throws ParseException { + Document document = Jsoup.parse(html); + Elements scoreElements = document.getElementsByClass("GridViewRowStyle"); + + List examInfos = new ArrayList<>(scoreElements.size()); + + for (Element scoreElement : scoreElements) { + Elements infoGirds = scoreElement.getElementsByTag("td"); + if (infoGirds.size() < 4) { + continue; + } + + ExamInfo examInfo = new ExamInfo(); + + examInfo.setCourseName(infoGirds.get(0).text()); + examInfo.setCredit(infoGirds.get(1).text()); + examInfo.setTerm(infoGirds.get(2).text()); + examInfo.setScore(infoGirds.get(3).text()); + + examInfos.add(examInfo); + } + + return examInfos; + } +} diff --git a/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateStudentInfoPageParser.java b/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateStudentInfoPageParser.java index 36cbbdf..9e17ba7 100644 --- a/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateStudentInfoPageParser.java +++ b/mywust-core/src/main/java/cn/linghang/mywust/core/parser/postgraduate/GraduateStudentInfoPageParser.java @@ -2,6 +2,7 @@ package cn.linghang.mywust.core.parser.postgraduate; import cn.linghang.mywust.core.exception.ParseException; import cn.linghang.mywust.core.parser.Parser; +import cn.linghang.mywust.core.util.JsoupUtil; import cn.linghang.mywust.model.global.StudentInfo; import org.jsoup.Jsoup; import org.jsoup.nodes.Element; @@ -17,81 +18,39 @@ public class GraduateStudentInfoPageParser implements Parser { StudentInfo student = new StudentInfo(); Element studentNumberElement = table.getElementById("txtxh"); - student.setStudentNumber(this.getAttr(studentNumberElement, "value")); + student.setStudentNumber(JsoupUtil.getAttr(studentNumberElement, "value")); // Element gradeElement = table.getElementById("txtnj"); -// int grade = Integer.parseInt(this.getAttr(gradeElement, "value")); +// int grade = Integer.parseInt(JsoupUtil.getAttr(gradeElement, "value")); Element idNumberElement = table.getElementById("txtsfzh"); - student.setIdNumber(this.getAttr(idNumberElement, "value")); + student.setIdNumber(JsoupUtil.getAttr(idNumberElement, "value")); Element nationalityElement = table.getElementById("drpmz"); - student.setNationality(this.getSelectContent(nationalityElement)); + student.setNationality(JsoupUtil.getSelectContent(nationalityElement)); Element hometownElement = table.getElementById("txtjg"); - student.setHometown(this.getAttr(hometownElement, "value")); + student.setHometown(JsoupUtil.getAttr(hometownElement, "value")); Element nameElement = table.getElementById("txtxm"); - student.setName(this.getAttr(nameElement, "value")); + student.setName(JsoupUtil.getAttr(nameElement, "value")); Element birthdayElement = table.getElementById("lblcsrq"); - student.setBirthday(this.getText(birthdayElement)); + student.setBirthday(JsoupUtil.getText(birthdayElement)); Element collegeElement = table.getElementById("droyx"); - student.setCollege(this.getSelectContent(collegeElement)); + student.setCollege(JsoupUtil.getSelectContent(collegeElement)); Element majorElement = table.getElementById("drozy"); - student.setMajor(this.getSelectContent(majorElement)); + student.setMajor(JsoupUtil.getSelectContent(majorElement)); Element genderElement = table.getElementById("droxb"); - student.setSex(this.getSelectContent(genderElement)); + student.setSex(JsoupUtil.getSelectContent(genderElement)); // 研究生没有班级 student.setClazz(""); return student; } - - /** - * 从Element中拿到指定的标签值 - * @param element 元素对象 - * @param key 标签值的key - * @return 相应的值,若element为空则返回空字符串 - */ - private String getAttr(Element element, String key) { - if (element == null) { - return ""; - } else { - return element.attr(key); - } - } - - /** - * 从Element中拿到指定的文本内容 - * @param element 元素对象 - * @return 相应的值,若element为空则返回空字符串 - */ - public String getText(Element element) { - if (element == null) { - return ""; - } else { - return element.ownText(); - } - } - - /** - * 从select类型的Element中拿取到已选中的选项值 - * @param element 元素对象 - * @return 相应的值,若element为空则返回空字符串 - */ - public String getSelectContent(Element element) { - if (element == null) { - return ""; - } else { - return element.getElementsByAttributeValue("selected", "selected") - .get(0) - .ownText(); - } - } } diff --git a/mywust-core/src/main/java/cn/linghang/mywust/core/parser/undergraduate/ExamInfoParser.java b/mywust-core/src/main/java/cn/linghang/mywust/core/parser/undergraduate/ExamInfoParser.java index 8a5e013..a706492 100644 --- a/mywust-core/src/main/java/cn/linghang/mywust/core/parser/undergraduate/ExamInfoParser.java +++ b/mywust-core/src/main/java/cn/linghang/mywust/core/parser/undergraduate/ExamInfoParser.java @@ -3,6 +3,7 @@ package cn.linghang.mywust.core.parser.undergraduate; import cn.linghang.mywust.core.exception.ParseException; import cn.linghang.mywust.core.parser.Parser; import cn.linghang.mywust.core.parser.undergraduate.xpath.ExamInfoXpath; +import cn.linghang.mywust.core.util.JsoupUtil; import cn.linghang.mywust.model.global.ExamInfo; import org.jsoup.Jsoup; import org.jsoup.nodes.Element; @@ -38,19 +39,23 @@ public class ExamInfoParser implements Parser> { ExamInfo examInfo = new ExamInfo(); // 这段看着震撼,但其实很丑 - examInfo.setId(girds.get(0).text()); - examInfo.setTerm(girds.get(1).text()); - examInfo.setCourseNumber(girds.get(2).text()); - examInfo.setCourseName(girds.get(3).text()); - examInfo.setGroupName(girds.get(4).text()); - examInfo.setScore(girds.get(5).text()); - examInfo.setFlag(girds.get(6).text()); - examInfo.setCredit(girds.get(7).text()); - examInfo.setCourseHours(girds.get(8).text()); - examInfo.setGradePoint(girds.get(9).text()); - examInfo.setEvaluateMethod(girds.get(11).text()); - examInfo.setKind(girds.get(12).text()); - examInfo.setCourseKind(girds.get(13).text()); + examInfo.setId(JsoupUtil.getElementContext(girds.get(0))); + + examInfo.setTerm(JsoupUtil.getElementContext(girds.get(1))); + examInfo.setCourseNumber(JsoupUtil.getElementContext(girds.get(2))); + + examInfo.setCourseName(JsoupUtil.getElementContext(girds.get(3))); + examInfo.setGroupName(JsoupUtil.getElementContext(girds.get(4))); + + examInfo.setScore(JsoupUtil.getElementContext(girds.get(5))); + examInfo.setFlag(JsoupUtil.getElementContext(girds.get(6))); + examInfo.setCredit(JsoupUtil.getElementContext(girds.get(7))); + examInfo.setCourseHours(JsoupUtil.getElementContext(girds.get(8))); + examInfo.setGradePoint(JsoupUtil.getElementContext(girds.get(9))); + + examInfo.setEvaluateMethod(JsoupUtil.getElementContext(girds.get(11))); + examInfo.setKind(JsoupUtil.getElementContext(girds.get(12))); + examInfo.setCourseKind(JsoupUtil.getElementContext(girds.get(13))); examInfos.add(examInfo); } diff --git a/mywust-core/src/main/java/cn/linghang/mywust/core/request/graduate/GraduateRequestFactory.java b/mywust-core/src/main/java/cn/linghang/mywust/core/request/graduate/GraduateRequestFactory.java index 74bfbde..7091361 100644 --- a/mywust-core/src/main/java/cn/linghang/mywust/core/request/graduate/GraduateRequestFactory.java +++ b/mywust-core/src/main/java/cn/linghang/mywust/core/request/graduate/GraduateRequestFactory.java @@ -43,4 +43,8 @@ public class GraduateRequestFactory extends RequestFactory { public static HttpRequest courseTableRequest(String cookie) { return makeHttpRequest(Graduate.GRADUATE_COURSE_TABLE_API, null, cookie); } + + public static HttpRequest examScoreInfoRequest(String cookie) { + return makeHttpRequest(Graduate.GRADUATE_SCORE_API, null, cookie); + } } diff --git a/mywust-core/src/main/java/cn/linghang/mywust/core/util/JsoupUtil.java b/mywust-core/src/main/java/cn/linghang/mywust/core/util/JsoupUtil.java new file mode 100644 index 0000000..9711452 --- /dev/null +++ b/mywust-core/src/main/java/cn/linghang/mywust/core/util/JsoupUtil.java @@ -0,0 +1,57 @@ +package cn.linghang.mywust.core.util; + +import org.jsoup.nodes.Element; + +public class JsoupUtil { + /** + * 获取Element对象中的内容(text),用途是对null判断,防止直接.text()产生空指针错误 + * + * @param element 元素对象 + * @return 获取到的内容,如果element为null,则返回一个空的字符串 + */ + public static String getElementContext(Element element) { + return element == null ? "" : element.text(); + } + + /** + * 从Element中拿到指定的标签值 + * @param element 元素对象 + * @param key 标签值的key + * @return 相应的值,若element为空则返回空字符串 + */ + public static String getAttr(Element element, String key) { + if (element == null) { + return ""; + } else { + return element.attr(key); + } + } + + /** + * 从Element中拿到指定的文本内容 + * @param element 元素对象 + * @return 相应的值,若element为空则返回空字符串 + */ + public static String getText(Element element) { + if (element == null) { + return ""; + } else { + return element.ownText(); + } + } + + /** + * 从select类型的Element中拿取到已选中的选项值 + * @param element 元素对象 + * @return 相应的值,若element为空则返回空字符串 + */ + public static String getSelectContent(Element element) { + if (element == null) { + return ""; + } else { + return element.getElementsByAttributeValue("selected", "selected") + .get(0) + .ownText(); + } + } +}