写个程序自动下载留言,没辙了:(

原创 2004年12月30日 00:39:00

刚写了个HTML文件解析器,生成简单的Element树,包括所有元素。

虽然有很多解析HTML的api,只是我只要用那么一点点功能,写一下也很快。

类:HTMLElement、HTMLParser、LoginAgent

目的是为了用程序去自动下载留言页面,使用HttpURLConnection post登录,搜索出loginForm的所有input,只需特别设置用户密码即可。

但是,页面打开后,里面的链接居然还要post数据,问题是input的值是页面上的javascript设置的,所以InputStream下载得到的没有值,晕倒!!没辙了。

package com.forum;
import java.io.*;
/**
 *
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author zfzheng 猪神
 * @version 1.0
 */
public class HTMLParser {

    public static HTMLElement buildHTMLElementFromFile(String fileName)throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"GB2312"));
        String line;
        StringBuffer result=new StringBuffer();
        while((line=br.readLine())!=null){
            result.append(line);
        }
        br.close();
        return buildHTMLElementFromString(result.toString());
    }


    public static HTMLElement buildHTMLElementFromString(String data){
        HTMLElement root=new HTMLElement();
        HTMLElement parent=root;
        root.setPrototypeString("根节点");
        HTMLElement e=null;
        char[] chs=data.toCharArray();
        char ch;
        int i=0;
        StringBuffer tagName=new StringBuffer();
        boolean inCommont=false;
        boolean tagDefineBegin=false;
        boolean tagDefineEnd=false;

        while(i<chs.length){
            ch=chs[i];
            if(inCommont){
                tagName.append(ch);
                if(chs[i]=='>' && i-2>=0 && chs[i-1]=='-' && chs[i-2]=='-'){//注释结束
                    inCommont=false;
                }
                continue;
            }

            switch(ch){
                case '<':{
                    if(i+1<chs.length && chs[i+1]!='/'){
                        tagDefineBegin = true;
                        tagDefineEnd=false;
                        e = new HTMLElement();
                    }else if(i+3<chs.length&& chs[i+1]=='!' &&chs[i+2]=='-' &&chs[i+3]=='-'){//注释
                        tagName.append(ch);
                        inCommont=true;
                    }else{//标记结束,等下一个循环
                    }
                    break;
                }
                case '>':{
                    if(tagDefineEnd){//结束
                        if (HTMLElement.isContentTag(tagName.toString())) { //可包含的标记结束,父节点返回上一层
                            if (parent.getParent() != null) { //返回上一层父节点
                                parent = parent.getParent();
                            }
                        }
                    }else{
                        tagDefineBegin = false;
                        e.setPrototypeString(tagName.toString());
                        parent.addChildren(e);
                        e.setParent(parent);
                        if (HTMLElement.isContentTag(e.getTagName())) { //可包含的标记
                            parent = e;
                        }else{
                            tagDefineEnd=true;
                        }
                    }
                    tagName.setLength(0);
                    break;
                }
                case '/':{
                    if(i>0 && chs[i-1]=='<'){
                        tagDefineEnd=true;
                        tagName.setLength(0);
                    }
                    break;
                }
                default:{
                    if(tagDefineBegin){
                        tagName.append(ch);
                    }else if(tagDefineEnd){
                        tagName.append(ch);
                    }
                    break;
                }

            }
            i++;
        }
        return root;
    }

public static void main(String[] args) {
    HTMLParser.buildHTMLElementFromString("<html><head><title> New Document </title><meta name='Generator' content='EditPlus'><meta ame='Author' content=''><meta name='Keywords' content=''><meta name='Description' content=''></head><body></body></html>").dump();
    try {
        HTMLParser.buildHTMLElementFromFile("d:/bb.htm").dumpHTML();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

}
}

[Windows][VC]开机自动启动程序的几种方法

【原文:http://www.cnblogs.com/upendi/archive/2012/07/04/sina-20110619.html】 很多监控软件要求软件能够在系统重新启动后不用...
  • zhazhiqiang2010
  • zhazhiqiang2010
  • 2016年07月14日 15:23
  • 2612

php+mysql留言板(模仿qq空间留言板)

这是一个模仿QQ空间里面的留言板,所写的一个简单留言板。运用的知识有PHP,mysql,还有一些简单的编程思想,这个里面没有管理员的功能。希望和大家一起交流一下。 首先建立一个Message的文件,里...
  • ckshcjhacmsabcbba
  • ckshcjhacmsabcbba
  • 2015年08月27日 22:38
  • 2855

关于vs2010运行C程序时,运行结果窗口一闪而过的问题

用VC++6.0和VS中的C++编程,今天正常安装好后,编写一个正确的程序,可运行的时候,DOS窗口一晃而过,也算是正常编译了,但我不懂的是它为什么消失得这么快? 会出现dos界面是因为你程序中可能...
  • u014021801
  • u014021801
  • 2014年11月05日 16:46
  • 3809

写个可以自动执行重复动作的Android程序。

前段时间,公司有个需求就是华为应用市场的下载量不高,问我能不能写个程序刷一下, 进入正题,Android里面有个辅助服务 AccessibilityService...
  • qq_36767261
  • qq_36767261
  • 2017年12月06日 12:12
  • 25

[纯C语言 + Win32 API]一步一步写个围棋程序之十:可以下棋了

  • 2012年09月01日 09:09
  • 381KB
  • 下载

这次用MFC写个闹钟程序

  • 2015年09月02日 11:38
  • 37KB
  • 下载

自己写个ping程序

  • 2007年12月12日 10:52
  • 1.57MB
  • 下载

[纯C语言 + Win32 API]一步一步写个围棋程序之十三:完善功能之二

  • 2012年09月03日 01:53
  • 384KB
  • 下载

[纯C语言 + Win32 API]一步一步写个围棋程序之十一:完善部分功能

  • 2012年09月01日 21:55
  • 382KB
  • 下载

[纯C语言 + Win32 API]一步一步写个围棋程序之五:工具栏之一

  • 2012年08月27日 23:40
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:写个程序自动下载留言,没辙了:(
举报原因:
原因补充:

(最多只允许输入30个字)