java模拟登录校内成绩查询网站,将获得的HTML代码用jsoup解析

java模拟登录学校教务系统,通过学号查询自己的成绩,将返回的html代码用jsoup解析,即可得到所需要的信息。

首先,我们要知道学校的成绩查询的IP地址或者网址,也就是处理你提交的代码的地址(后台,或许是PHP页面,也可能是JSP页面,说不定是ASP页面),这个我们可以通过浏览器自带的开发人员工具查看表单提交到的地址,或者直接查看网页的源代码获取表单的提交地址,当然,不要忘了把form表单里面的地址和当前所在的地址做连接。

(浏览器的开发者工具恕不赘述)

 

通过开发者工具,发现form表单的提交方法为post,请求处理的页面 和 Form Data如下:

 

&连接符后面的是sublime按钮,这个不用管它。

这个 Form Data的格式很容易构造,直接String就可以。

下面是获取服务器返回网页源码的java源代码,也就是一个模拟登录的代码。

 

 

 Java Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static String tPost() throws  IOException {

  Scanner scanner = 
new Scanner(System.in
);
  System.out.println(
"请输入正确的学号:"
);
  
String
 xuehao = scanner.next();
  scanner.close();
  
  
// 创建URL对象
  String surl = "响应的地址";
// 查以前的成绩,不需要密码
  URL connURL = new
 URL(surl);

  
// 打开URL
  HttpURLConnection httpConn = (java.net.HttpURLConnection) connURL
    .openConnection();
  httpConn.setDoInput(true);
  httpConn.setDoOutput(true);

  
// 获取HttpURLConnection对象对应的输出流
  PrintWriter out = null;
  out = 
new
 PrintWriter(httpConn.getOutputStream());
  out.write(
"post_xuehao="
 + xuehao);
  out.flush();
  out.close();

  
// 获取服务器响应
  String sCurrentLine = ""
;
  
String sTotalString = ""
;
  BufferedReader l_reader = 
new BufferedReader(new
 InputStreamReader(
    httpConn.getInputStream(), 
"UTF-8"
));
  
while
 ((sCurrentLine = l_reader.readLine()) != null) {
   sTotalString += sCurrentLine + 
"\r\n"
;
  }
  
return
 sTotalString;

 }

 

 

至此,我们已经得到了服务器返回的网页的源码,下面用jsoup解析这一坨源码。

jsoup是一个第三方jar包,可以下载后直接使用,下载请戳 这里    http://download.csdn.net/detail/huangyuan_xuan/7996797

 

下面是用jsoup解析HTML的源代码

 

 

 Java Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67


public   static   void  main( String [] args)  throws  IOException {
  
// 将抓到的字符串转化为doc,方便用jsoup解析
   String  html = tPost();
  Document doc = Jsoup.parse(html);

  
// 获取当前学生的课程总数,因为有重修的。重修的同学和没有重修的同学的课程总数有差异。


  Element count = doc.getElementsByTag(
"caption" ).get( 2 );     

//这个课程总数的存在位置是通过查看网页源码得到的,其网页源码如下

//<caption>
//     <span class="style3">成绩信息</span> (共43项)
//   </caption>


  
String  caption = count.toString();
  
int  BeginIdex = caption.indexOf( '(' ) +  2 ;
  
int  EndIdex = caption.indexOf( ')' ) -  1 ;
  
int  classCount = Integer
    .parseInt(caption.substring(BeginIdex, EndIdex));

//通过上面的过程,我们就获得了该学生的课程总数

//因为返回的页面很有规律,都是一些TR和TD的表格,看一看有用信息所在的位置,直接将参数写死,不用改变。


  
for  ( int  flag =  10 ; flag <= classCount +  9 ; flag++) {
   
// 得到课程名称
   Element tr = doc.getElementsByTag( "tr" ).get(flag);
   
String  coursetd = tr.getElementsByTag( "td" ).get( 5 ).toString();
   
int  BIndex = coursetd.indexOf( ";" ) +  1 ;
   
int  EIndex = coursetd.lastIndexOf( "<" );
   
String  className = coursetd.substring(BIndex, EIndex);

   
// 得到该课程的学分
    String  credittd = tr.getElementsByTag( "td" ).get( 7 ).toString();
   BIndex = credittd.indexOf(
";" ) +  1 ;
   EIndex = credittd.lastIndexOf(
"<" );
   
String  credit = credittd.substring(BIndex, EIndex);

   
// 得到课程成绩
    String  scoretd = tr.getElementsByTag( "td" ).get( 9 ).toString();
   BIndex = scoretd.indexOf(
";" ) +  1 ;
   EIndex = scoretd.lastIndexOf(
"<" );
   
String  courseScore = scoretd.substring(BIndex, EIndex);

   
// 得到补考或者重修的成绩
    String  score_td = tr.getElementsByTag( "td" ).get( 10 ).toString();
   BIndex = score_td.indexOf(
";" ) +  1 ;
   EIndex = score_td.lastIndexOf(
"<" );
   
String  course_Score = score_td.substring(BIndex, EIndex);

   
// 输出信息
    System.out.println(className);
    System.out.println(
"学分"  +  "\t\t"  +  "原考成绩"  +  "\t\t"  +  "重修/补考成绩" );
    System.out.print(credit + 
"\t\t" );
    System.out.print(courseScore + 
"\t\t" );
    System.out.println(course_Score + 
"\t\t" );
   
  }

 }

 

 

效果如下

 

 

特别感谢:LiuNing提供的解析HTML的方法,节省了我很多的时间,因为我已开始是想用 正则 来获取这些信息的。

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、创建类实现基本对象和他们关系的管理,包括学生、教学班、课程、成绩、教师等。使用集合框架存储所有对象。学生至少包含学号、姓名、性别等信息。教学班至少包含教师、课程名字、总人数、教学班号、开课学期等信息。课程至少包含课程编号、课程名字等信息。教师至少包含教师编号、姓名等信息。 2、随机生成学生,数量不少于100。一个教学班有一个教师上一门课程,教学班的学生数量不少于20。课程数量不少于3门。教师数量不少于6个。一门课至少有两个老师上课。每个学生选择至少选择3门课程。一个学生在一个教学班上一门课,考试后取得一个成绩。一门课的成绩构成有4部分构成,包括平时成绩、期中考试、实验成绩和期末考试成绩,然后计算出总成绩成绩随机生成,均为整数。 3、分阶段模拟教学过程。例如执行一个命令,可以生成一个教学班的所有学生的平时成绩。第一步,生成初始化数据,包括教师,学生、课程,教学班等;第二步,学生选课,随机进行,为每门课程的教学班安排学生。第三步,获得平时成绩获得期中成绩获得实验成绩获得期末成绩,最后计算总成绩。 4、能够显示一个教学班级的学生,可以根据学号排序,可以根据成绩排序。可以通过名字查询成绩,可以按照各科成绩和总成绩进行排名显示,可以统计各课程学生成绩的分数段分布。 5、可以实现自己的扩展功能。注意类和类之间的关系。充分利用继承,多态等特性,使用上抽象类,接口,泛型,内部类等设计元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值