刚写了个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();
    }

}
}

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

  1. 用Java写一个电影自动下载器

    你好! 下面是一些步骤来帮助你写一个电影自动下载器: 建立一个新的Java项目 选择一个电影下载网站作为数据源, 并使用网络爬虫或API来获取电影的信息(如标题, 时长, 格式, 大小等) 使用Jav ...

  2. c#实现客户端程序自动下载更新(单独程序)

    首先,自己工作需要实现客户端程序的自动更新下载,下面简单介绍自己实现逻辑和遇到的一些问题及解决方法 信息基本都是通过XML文件配置的,下文本地需要更新的程序简称为主程序 实现步骤简介: 1.获取本地程 ...

  3. 手机 查看java源码_pin.java 源代码在线查看 - 一个专门为手机写的程序 资源下载 虫虫电子下载站...

    /*********************************************************************** * * *软件:公交路线选择软件 *作者:李蛟 *学校 ...

  4. 从谷歌和译典通能上自动下载英语单词mp3的好方法

    从谷歌和译典通能上自动下载英语单词mp3的好方法 最近在学英语,很多单词不怎么会读.每次得去iciba.com和dreye.com上查,很是麻烦! 后来一想,能不能写个程序自动下载?测试一番,最终搞定 ...

  5. 【Python实战】批量爬取微博素材,一分钟百张大图自动下载

    目录 前言 一.思考逻辑 二.观察URL 三.微博爬虫 四.下载保存 结尾 前言 大家好,我是Samaritan. 这期本来想做个咸鱼 写个学习笔记发的,然后没做成咸鱼 临时变卦,再写一期实战. 事情 ...

  6. 通过脚本自动下载麦咖啡病毒升级包

    前些天在一个blog上看到有人用python写了一个脚本,通过抓取网页然后分析,可以实时监控有没有火车票转让,并且把结果发送到自己的Gtalk中.感觉很好玩.今天我也写了一个自动下载麦咖啡病毒升级包的 ...

  7. STC单片机自动下载调试器设计

    目录 简介 改进方案 1. 解决思路 2. 电路设计 3. 软件 测试结果 参考文献 简介 在推文<全自动STC下载电路设计>中给出了利用STC单片机的ISP程序自动下载调试板的是设计.使 ...

  8. 央行公开市场操作(正逆回购、MLF)数据自动下载及分析

    在做外汇掉期交易的时候,除了需要关注中美息差的走势,也需要了解市场流动性的松紧程度.央行的公开市场操作是市场流动性拼图里面非常重要的一块.实际工作中,有些资讯系统(例如Bloomberg)可以调出央行 ...

  9. 论ESP32自动下载电路

    1.先来看看ESP32手册说明的启动运行方式 由上图可知,ESP32有SPI启动模式(正常启动)与下载启动模式两种,要实现程序自动下载肯定是需要上电时自动进入下载启动模式,方法就是将GPIO0与GPI ...

最新文章

  1. Windows2003 IIS安装
  2. python常考题_Python语言基础考察点:python语言基础常见考题(一)
  3. Oracle把逗号分割的字符串转换为可放入in的条件语句的字符数列
  4. 在win10系统下怎样快速切换任务视图
  5. LeetCode 2114. 句子中的最多单词数
  6. [深度学习-原理]浅谈Attention Model
  7. c语言编程题一空几分,C语言编程规范试题
  8. 计算机图书管理属于计算机应用中的,计算机在图书管理中应用探究.doc
  9. Visual Studio 2017 通过SSH 调试Linux 上.NET Core
  10. setmaximumsize java_setMaximumSize为什么不起作用
  11. ligerui php mysql_ligerui中3级联动的数据库例子
  12. EditRocket for Mac(源代码编辑器)v4.5.10
  13. AGC022E Median Replace
  14. 计算机会计信息系统的数据处理方式一般,《会计信息系统复习资料.doc
  15. siri中文语音助理_2020年人工智能和语音控制的7项新发展
  16. hp电脑测试软件,HP惠普笔记本电池检测工具Battery Check V4.1.0.2中文官方版
  17. 贪心科技机器学习训练营(十一)
  18. ctf————逆向新手题8(logmein)WP
  19. 不管发生什么事,最重要的是拥有乐观积极的心态,困难总会过去的。
  20. Java使用三层架构、JDBC连接数据库完成《试题信息管理系统》

热门文章

  1. 用别人的钱创咖啡的业,戴威与陆正耀殊途同归?
  2. 2022年中国PCB铜箔市场现状及趋势分析:未来高端PCB铜箔产能扩张需求较为迫切
  3. php网页源码物业管理系统mysql数据库web结构html布局计算机软件工程
  4. 关于“SLComposeViewController” in iOS 11
  5. 西门子PLC基于MODBUS RTU通信协议时的寄存器地址对应关系及错误代码
  6. Java基础3 -- 循环语句
  7. 在linux下自动备份数据库,并且发送邮件。
  8. 钉钉版会议室预订系统使用指南
  9. 0909 编译的开始
  10. 维纳滤波复原噪声图像