文档章节

html脚本解释器-【c#】

开飞色
 开飞色
发布于 06/14 22:53
字数 698
阅读 59
收藏 1

几年前刚学c#写的 解析类发出来


namespace 采集脚本_1
{
    
    class zd
    {
        爬虫类 pa=new 爬虫类();
        http_post post_1=new http_post() ;
        http_get get_1 = new http_get();
        public string get_x(string url,string cookies)
        {
            string y_data=pa.get网页源码(url,"",cookies,"get");
            return y_data;
        }
        public string post_x(string url, string data, string cookies)
        {
            string y_data = pa.get网页源码(url, data, cookies, "post");
            return y_data;
        }
        public ArrayList xpath_s(string data,string xpath,string ads)
        {
            ArrayList xp_list_1 = new ArrayList();
            HtmlNodeCollection txt=pa.解析html多(data,xpath);
            foreach(HtmlNode htm in txt)
            {
                if (ads != "")
                { xp_list_1.Add(htm.Attributes[ads].Value); }
                else { xp_list_1.Add(htm.InnerText); }
            }
            return xp_list_1;
        }  
        #region 单个html处理
        /// <summary>
        /// 处理单个html
        /// </summary>
        /// <param name="data"></param>
        /// <param name="xpath"></param>
        /// <returns></returns>
        public string xpath_d(string data,string xpath)
        {
            string s_data=pa.解析html单(data,xpath);
            return s_data;
        }
#endregion
        #region 载入脚本
        /// <summary>
        /// 初始化载入脚本
        /// </summary>
        /// <returns></returns>
        public HtmlNodeCollection load(string bane)
        {
            HtmlNodeCollection ini;
            string data_io = bane;
            ini = pa.解析html多(data_io, "//node/node");
            return ini;
        }
        #endregion
        #region 异常处理
        public void end(string k, TextBox a)
        {
            a.AppendText(k + "\n");
        }
        #endregion
        /// <summary>
        /// 逐行解析脚本
        /// </summary>
        /// <param name="jx_list"></param>
        public void jx(HtmlNodeCollection jx_list,string q_data,ArrayList q_list,TextBox tex,Timer tim,string canshu)
        {
            if (jx_list != null)
            {
                foreach (HtmlNode dd in jx_list)
                {
                    string jx_name = dd.Attributes["name"].Value;
                    switch (jx_name)
                    {
                        case "http_post"://post读取网页
                            http_post post = new http_post();
                            post.http_url = dd.Attributes["url"].Value;
                            post.http_data = dd.Attributes["data"].Value;
                            post.http_cookies = dd.Attributes["cookies"].Value;
                            q_data = post_x(post.http_url, post.http_data, post.http_cookies);
                            break;
                        case "http_get"://get读取网页
                            http_get get = new http_get();
                            get.http_url = dd.Attributes["url"].Value.Replace("【i】",canshu);
                            get.http_cookies = dd.Attributes["cookies"].Value;
                            q_data = get_x(get.http_url, get.http_cookies);
                            break;
                        case "xpath_d"://单个解析xpath
                            string s_xpath_1 = dd.Attributes["xpath"].Value;
                            q_data = xpath_d(q_data, s_xpath_1);
                            break;
                        case "xpath_s"://多个解析xpath
                            string s_xpath = dd.Attributes["xpath"].Value;
                            string iff = dd.Attributes["if"].Value;
                            q_list = xpath_s(q_data, s_xpath,iff);
                            break;
                        case "w"://输出信息
                            string sta = dd.Attributes["state"].Value;
                            string atrin = dd.Attributes["string"].Value.Replace("【i】",canshu);
                            if (sta == "str")
                            {
                                tex.Invoke(new MethodInvoker(delegate{end(atrin + q_data, tex);}));

                            }
                            else if (sta == "data") { tex.Invoke(new MethodInvoker(delegate { end(atrin, tex); })); }
                            else
                            {
                                tex.Invoke(new MethodInvoker(delegate
                                {
                                    foreach (string ss in q_list)
                                    {
                                        end(ss, tex);
                                    }
                                }));
                            }
                            break;
                        case "for":
                            forr forr = new forr();
                            string s_sub = dd.Attributes["sub"].Value;
                            int ine = 0;
                            if (s_sub == "cont")
                            {
                                endfor(q_list.Count, dd.InnerHtml, q_data, q_list, tex, tim,ine);
                            }
                            else
                            {
                                endfor(int.Parse(s_sub), dd.InnerHtml, q_data, q_list, tex, tim,ine);
                            }
                            break;
                        case "clear":
                            string zdd=dd.Attributes["attribute"].Value;
                            if (zdd == "list")
                            {
                                q_list.Clear();
                            }
                            else {
                                q_data = "";
                            }
                            break;
                        case "clean":
                            tex.Text = "";
                            break;
                        case "time":
                            q_data = DateTime.Now.ToString();
                            break;
                        case "timer":
                            string tine=dd.Attributes["int"].Value;
                            int m = (1000 * 60) * int.Parse(tine);
                            tim.Interval = m;
                            tim.Enabled = true;
                            break;
                        case "io":
                            //q_data = dd.Attributes[""]
                            break;

                    }
                }
            }
            else { end("初始化脚本错误!!!", tex); }
        }

        /// <summary>
        /// 循环 处理
        /// </summary>
        /// <param name="cs"></param>
        /// <param name="nr_data"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        /// <param name="d"></param>
        /// <param name="f"></param>
        /// <param name="ino"></param>
        public void endfor(int cs,string nr_data,string b,ArrayList c,TextBox d,Timer f,int ino)
        {
            for (int j = 0; j < cs;j++ )
            {
                ino = j;
                HtmlNodeCollection htmll=pa.解析html多(nr_data, "//node");
                if(htmll!=null)
                {
                    jx(htmll, b, c, d,f,j.ToString());   
                    
                }
            }
        }

    }
    public class http_post
    {
        public string http_url { set; get; }
        public string http_cookies { set; get; }
        public string http_data { set; get; }
    }
    public class http_get
    {
        public string http_url { set; get; }
        public string http_cookies { set; get; }
    }
    public class forr
    {
        /// <summary>
        /// 次数
        /// </summary>
        public int i { set; get; }//次数
        /// <summary>
        /// 下标
        /// </summary>
        public int a { set; get; }//列表下标
    }
}

为什么叫html解释器呢,因为利用了html节点树解析,也可以利用别的结构 例如xml 或者自己实现解析 。 下面是运行时状态

© 著作权归作者所有

共有 人打赏支持
上一篇: 吐槽一下
开飞色
粉丝 17
博文 60
码字总数 50895
作品 0
昆明
程序员
私信 提问
编译性语言、解释性语言和脚本语言的区别

一、翻译和解释的不同 翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。编译型语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,...

旋转木马-千里马
2016/01/08
404
0
编译型语言、解释型语言、脚本语言之间的区别与联系

任何语言都必须翻译成机器语言,计算机才能运行高级语言编写的程序。 翻译的方式有两种:一个是编译,一个是解释。 1.编译型语言 编译型语言写的程序在被执行之前,需要一个专门的编译过程,...

威士忌de碎冰
2017/12/02
0
0
编译型语言和解释型语言(一)

首先,我们编程都是用的高级语言(写汇编和机器语言的大牛们除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行高级语言所编写...

HaleyLiu
2017/10/22
0
0
python浓缩(1)欢迎来到Python世界!

1.1 什么是python Python 是一门优雅而健壮的编程语言,它继承了传统编译语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性。 1.2 起源 范·罗萨姆期望的工具有一些是用于完成日...

人生如梦19
2016/04/09
157
0
什么是编译性语言、解释性语言和脚本语言

什么是编译性语言、解释性语言和脚本语言   计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能值型高级语言编写的程序。  翻译的方式有...

AlphaJay
2010/08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

揭秘 | 双11逆天记录背后的数据库技术革新

摘要: 第十个天猫“双11”狂欢节圆满落幕,如今双11已不仅仅是天猫的盛会,更是阿里技术人的新年 每一个数字背后 都需要强大的技术支撑 Higher, Faster, Smarter 是我们不变的追求 技术无边...

阿里云云栖社区
22分钟前
4
0
element ui中的input组件不能监听键盘事件解决

vue使用element-ui的el-input监听不了键盘事件,原因应该是element-ui自身封装了一层div在input标签外面,把原来的事件隐藏了,所以如下代码运行是无响应的: <el-input v-model="search" p...

呵呵闯
24分钟前
3
0
Linux常用中间件启动命令

zookeeper redis lts

王桥修道院副院长
25分钟前
1
0
Kotlin极简教程中对? extends 和 ? super (out和int)的描述

PECS 现在问题来了:我们什么时候用extends什么时候用super呢?《Effective Java》给出了答案: PECS: producer-extends, consumer-super 比如,一个简单的Stack API: public class Stack<E...

SuShine
26分钟前
1
0
微信分享link问题

前提:公司业务,分享的页面需要自定义并且是一个固定页面 因此自定义分享link,这里存在一个问题,必须与安全域名一致,自不必说,而且这个link必须是当有协议的,也就是说不能写成locatio...

litCabbage
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部