原文地址为: 使用HtmlParser解析HTML

如果要对HTML进行 解析,提取HTML的数据或者修改HTML数据, HtmlParser是一个不错的选择.
使用HtmlParser可以解析本地和网络上的HTML数据:

Parser parser  =   new  Parser(  new  Winista.Text.HtmlParser.Http.HttpProtocol( new  Uri( " uriString ") ));

Parser parser  =   new  Parser(  new  Winista.Text.HtmlParser.Lex.Lexer(  " HtmlString "  ) );

System.IO.Stream stream  =   new  System.IO.FileStream(  " filePath "  , System.IO.FileMode.Open );
Parser parser  =   new  Parser(  new  Winista.Text.HtmlParser.Lex.Lexer(  new  Winista.Text.HtmlParser.Lex.Page( stream , " charSet " ) ) );

还可以分析某些特定节点的数据,使用 NodeClassFilter 指定要分析的节点类型:

NodeFilter filter  =   new  NodeClassFilter(  typeof ( Winista.Text.HtmlParser.Tags.Div ) );

使用Parser实例的Parse方法可以获得节点数组

NodeList nodeList  =  parser.Parse(  null  );

NodeList nodeList  =  parser.Parse( filter);

现在分析一下的一段HTML:

< div  class ="divCss"  id ="div_1" >
     < div  name ="div"  class ="divCss"  id ="div_2" > div_2 </ div >
     < table  name ="table"  id ="table_1" >
         < tr >
             < td > HtmlParser </ td >
             < td >< div  id ="div_3" >< font  color ="red" > HtmlParser </ font ></ div ></ td >
         </ tr >
     </ table >
</ div >

txtResult是显示分析处理后的数据,txtSource是读取HTML数据的文本框

// 记录个节点的起始位置,避免重复处理
    IList < int >  start  =   new  List < int > ( );
     protected   void  Button1_Click (  object  sender , EventArgs e )
     {
        this.txtResult.Text = string.Empty;
        Lexer lexer = new Lexer( this.txtSource.Text );
        Parser parser = new Parser( lexer );
        NodeFilter filter = new NodeClassFilter( typeof( Winista.Text.HtmlParser.Tags.Div ) );
        NodeList nodeList = parser.Parse( null );
        if ( nodeList.Count == 0 )
            txtResult.Text = "没有符合要求的节点";
        else
        {
            for ( int i = 0 ; i < nodeList.Count ; i++ )
            {
                paserData( nodeList[i] );
            }
        }
    }
     private  ITag getTag ( INode node )
     {
        if ( node == null )
            return null;
       return  node is ITag  ? node as ITag :  null;
    }

     private   void  paserData ( INode node)
     {
        ITag tag = getTag( node );
        if ( tag != null && !tag.IsEndTag( ) && !start.Contains(tag.StartPosition))
        {
            object oId = tag.GetAttribute( "ID" );
            object oName = tag.GetAttribute( "name" );
            object oClass = tag.GetAttribute( "class" );
            this.txtResult.Text += tag.TagName + ":\r\nID:" + oId + " Name:" + oName
                   + " Class:" + oClass + " StartPosition:" + tag.StartPosition.ToString( ) + "\r\n";
            start.Add( tag.StartPosition );
        }
        //子节点
        if ( node.Children != null && node.Children.Count > 0 )
        {
            paserData( node.FirstChild );
        }
        //兄弟节点
        INode siblingNode = node.NextSibling;
        while ( siblingNode != null )
        {
            paserData( siblingNode );
            siblingNode = siblingNode.NextSibling;
        }
    }

txtResult显示的数据为:

DIV:
ID:div_1 Name: Class:divCss StartPosition:0
DIV:
ID:div_2 Name:div Class:divCss StartPosition:34
TABLE:
ID:table_1 Name:table Class: StartPosition:90
TR:
ID: Name: Class: StartPosition:127
TD:
ID: Name: Class: StartPosition:136
TD:
ID: Name: Class: StartPosition:160
DIV:
ID:div_3 Name: Class: StartPosition:164
FONT:
ID: Name: Class: StartPosition:180

HtmlParser将我们指定的数据给分析出来了,现在来对要分析的数据进行一些修改:给没有name和class属性的指定属性:

           object  oId  =  tag.GetAttribute(  " ID "  );
             object  oName  =  tag.GetAttribute(  " name "  );
             object  oClass  =  tag.GetAttribute(  " class "  );

             if  ( oName  ==   null  )
             {
                oName = "name";
                tag.SetAttribute( "name" , oName.ToString( ) );
            }
             if  ( oClass  ==   null  )
             {
                oClass = "class";
                tag.SetAttribute( "name" , oClass.ToString( ) );
            }
             this .txtResult.Text  +=  tag.TagName  +   " :\r\nID: "   +  oId  +   "  Name: "   +  oName
                    +   "  Class: "   +  oClass  +   "  StartPosition: "   +  tag.StartPosition.ToString( )  +   " \r\n " ;
            start.Add( tag.StartPosition );

txtResult显示的数据为:

DIV:
ID:div_1 Name:name Class:divCss StartPosition:0
DIV:
ID:div_2 Name:div Class:divCss StartPosition:34
TABLE:
ID:table_1 Name:table Class:class StartPosition:90
TR:
ID: Name:name Class:class StartPosition:127
TD:
ID: Name:name Class:class StartPosition:136
TD:
ID: Name:name Class:class StartPosition:160
DIV:
ID:div_3 Name:name Class:class StartPosition:164
FONT:
ID: Name:name Class:class StartPosition:180

HtmlParser实现了我们的目的,现在在给节点为DIV并且ID为div_3的节点添加一个子节点:

            object  oId  =  tag.GetAttribute(  " ID "  );
             object  oName  =  tag.GetAttribute(  " name "  );
             object  oClass  =  tag.GetAttribute(  " class "  );
             if  ( tag.TagName  ==   " DIV "   &&  tag.GetAttribute(  " ID "  )  ==   " div_3 "  )
             {
                INode newNode = new TextNode( "add a new node" );
                tag.Children.Add( newNode );
            }
             this .txtResult.Text  +=  tag.TagName  +   " :\r\nID: "   +  oId  +   "  Name: "   +  oName
                    +   "  Class: "   +  oClass  +   "  StartPosition: "   +  tag.StartPosition.ToString( )  +   " \r\n " ;

输出nodeList[0].ToHtml( ):

< div  class ="divCss"  id ="div_1" >
     < div  name ="div"  class ="divCss"  id ="div_2" > div_2 </ div >
     < table  name ="table"  id ="table_1" >
         < tr >
             < td > HtmlParser </ td >
             < td >< div  id ="div_3" >< font  color ="red" > HtmlParser </ font > add a new node </ div ></ td >
         </ tr >
     </ table >
</ div >

id为div_3的div节点后面加上了要添加的数据.

转载请注明本文地址: 使用HtmlParser解析HTML

使用HtmlParser解析HTML相关推荐

  1. htmlparser解析网站时服务器返回的文件编码和页面编码不一致问题

    1.用htmlparser解析http://gz.fang.com/抛出如下异常: Exception in thread "main" org.htmlparser.util.E ...

  2. 用HTMLParser解析html时报错:No module named 'htmlentitydefs'

    python3.6用HTMLParser解析html时报错 No module named 'htmlentitydefs'或No module named 'markupbase' 先上代码 fro ...

  3. 在.net中运用HTMLParser解析网页的原理和方法

    本文介绍了.net 版的一个HTMLParser网页解析开源类库(Winista.HTMLParser)的功能特性.工作原理和使用方法.对于使用.net进行Web信息提取的开发人员进行了一次HTMLP ...

  4. htmlparser解析网页内容代码

    /*抽取html网页文本,循环到值节点并判断是否有src链接*/public void htmlText(String url) throws Exception{try {URL u = new U ...

  5. python中html.parser_在Python中使用HTMLParser解析HTML的教程

    如果我们要编写一个搜索引擎,第一步是用爬虫把目标网站的页面抓下来,第二步就是解析该HTML页面,看看里面的内容到底是新闻.图片还是视频. 假设第一步已经完成了,第二步应该如何解析HTML呢? HTML ...

  6. python 解析html 模块_使用 Python 模块—— HTMLParser 解析 HTML 文档元素

    标签: 这个文档定义了一个 HTMLParser 类作为解析 HTML 文档的基础. HTMLParser 类的实例可以存储并调用方法来处理 HTML 标签和数据. 我们一般通过建立一个 HTMLPa ...

  7. python之HTMLParser解析HTML文档

    HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析. 本文主要简单讲一下HTMLParser的用法. 使用时需要定义一个从类HTMLParser继承的类,重定义 ...

  8. 利用武稀松版HtmlParser解析Html,使用CSS选择器定位节点

    {Html解析器.最近因为用到Html解析功能.在网上找了几款Delphi版本的,结果发现解析复杂的HTML都有一些问题.没办法自己写了一款,经测试到现在没遇到任何解析不了的Html.wr960204 ...

  9. HTMLParser解析html详解

    HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索.对于初学者还是要费一些功夫的,而一旦上手以后,会发现HTMLParser的结构设计很巧妙,非常实用, ...

最新文章

  1. Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
  2. 实验室蒋田仔研究员:脑网络组图谱近10年研究详解【附PPT】
  3. 关于卡巴斯基安全免疫区随笔
  4. 012_CSS相邻兄弟选择器
  5. 2021牛客暑期多校训练营2 L-WeChat Walk(分块)
  6. art-template辅助函数和子模板
  7. 改变centos系统的时区
  8. Java集合框架之三:HashMap源码解析
  9. mysql 1129 错误Host is blocked because of many connection errors; unblock with 'mysqladmin flush-host
  10. 船说CMS小说采集-船说小说免费采集-船说CMS自动采集发布方法详解
  11. Ubuntu安装wechat的血泪史
  12. php表格怎么加粉色,为什么EXCEL算出的数据表格变成粉色-这个粉红色在excel表中怎么设置出来,参数值~...
  13. SCI、EI、ISTP国际三大检索分别指的是什么?
  14. Who do you think is the best coder, and why?
  15. 深入理解内存:原理简介
  16. python27.dll是系统自带的吗_Windows 10自带6款超强工具!好用又免费!
  17. 【2022-8-27完美世界】完美世界图像算法岗笔试
  18. 知识就是力量:博客中实现个人微信免签收款,让知识产生价值
  19. 24-讲一讲公平锁和非公平锁,为什么要“非公平”?
  20. Java POI XSSF

热门文章

  1. 都说2022是Java程序员的危机年,却不断有人跳槽拿30K+,为什么
  2. Jquery水车旋转的相册
  3. c/c++ restrict修饰符介绍
  4. WinEDT输入中文
  5. ROS1Melodic+ROS2Dashing+Arduino+SLAM学习镜像(机器人控制器编程等课程资料)
  6. web简单案例-用户信息查询
  7. 编程需要学计算机基础嘛,非计算机专业学编程需要什么基础?
  8. Bootstrapping 简介,应用,利弊分析
  9. E. Massage
  10. [转]xbeta(善用佳软) 【xbeta精心荐精品之免费软件列表 】牛!