`

使用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节点后面加上了要添加的数据.

分享到:
评论

相关推荐

    Python中使用HTMLParser解析html实例

    主要介绍了Python中使用HTMLParser解析html实例,本文直接给出使用示例,并总结出HTMLParser含有的方法分为两类,一类是需要显式调用的,而另一类不需显示调用,需要的朋友可以参考下

    htmlparser的jar包

    之后,通过`import`语句引入所需的类,就可以开始使用HTMLParser解析HTML文档了。 总的来说,HTMLParser是一个强大且灵活的工具,适用于需要解析和操作HTML的Java应用,如爬虫、数据提取、网页自动化等场景。通过...

    基于Java的源码-HTML文档解析器 HTMLParser.zip

    例如,以下是一个简单的使用HTMLParser解析HTML并打印所有`&lt;a&gt;`标签的例子: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser.nodes.TagNode; public ...

    使用HtmlParser

    《使用HtmlParser解析HTML网页内容》 在信息技术领域,HTML(HyperText Markup Language)是用于构建和呈现网页的标准标记语言。然而,对于开发者而言,直接处理HTML文本有时是一项挑战,尤其是当需要从中提取特定...

    html.rar_htmlparser_java parsing html

    接下来,让我们通过一个简单的示例来了解如何使用HTMLParser解析HTML文档。假设我们有一个HTML文件,名为`index.html`,包含以下内容: ```html &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;title&gt;Example Page &lt;h1&gt;Hello, World...

    htmlparser解析html分页

    HTMLParser是一个用于解析HTML文档的库,尤其在处理非结构化或不标准的HTML时非常有用。这个库可能被用于从网页中提取数据,比如在爬虫项目中,或者进行自动化测试时解析页面内容。本篇文章将深入探讨HTMLParser的...

    htmlparser解析Html的jar包和源文件包(两个)

    HTMLParser是一款专为Java开发人员设计的开源库,用于解析HTML文档。这个工具包小巧而强大,能够处理不规则的HTML结构,对于处理网络爬虫、网页数据提取或需要解析HTML内容的应用程序来说,是非常实用的。在提供的...

    在Python中使用HTMLParser解析HTML的教程

    如果我们要编写一个搜索引擎,第...好在Python提供了HTMLParser来非常方便地解析HTML,只需简单几行代码: from HTMLParser import HTMLParser from htmlentitydefs import name2codepoint class MyHTMLParser(HTMLPa

    htmlparser(HTML页面解析)例子

    在本例中,我们将深入探讨如何使用HTMLParser库解析HTML页面,提取所需信息。 首先,我们需要导入Python的`HTMLParser`模块。在Python 3中,这个模块已经被重命名为`html.parser`,因此应该导入`html.parser`,而...

    Java中解析html的开源项目04

    接下来,我们可以创建一个简单的例子来展示如何使用HTMLParser解析HTML: 1. DOM解析示例: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeList; import org.htmlparser.util....

    java解析html工具htmlparser的jar包及api文档

    例如,以下是一个简单的使用示例,展示如何使用HTMLParser解析一个HTML字符串并打印出所有的`&lt;a&gt;`标签: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser....

    使用 HttpClient 和 HtmlParser 实现简易爬虫

    使用HtmlParser解析HTML文档,可以通过创建`HtmlParser`对象并调用其`parse`方法完成。 2. **提取所需信息:** 通过HtmlParser提供的各种过滤器和访问者模式,可以从解析后的HTML文档中抽取所需的信息。 3. **...

    使用HTMLPARSER和HTTPCLIENT制作网络爬虫,附赠相关技术文档。

    使用HTMLPARSER解析HTML内容。首先,创建一个ParserDelegator对象,然后调用parse方法,传入HTML内容和一个Handler。Handler是自定义的接口实现,用于处理解析过程中遇到的每个HTML元素。 6. **提取数据**: 在...

    htmlparser.jar.zip

    例如,以下是一个简单的使用HTMLParser解析HTML并提取所有链接的例子: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeList; import org.htmlparser.util.NodeIterator; public class ...

    使用HTMLParser解析网页,找出文章后下载保存

    总结来说,使用HTMLParser解析网页涉及到以下步骤: 1. 继承`HTMLParser`并重写相关方法以定义解析逻辑。 2. 找到文章内容所在的标签,如`&lt;p&gt;`或`&lt;article&gt;`,并在适当的方法中处理它们。 3. 收集文章文本,并在适当...

    HTMLParser的使用

    以下是一个简单的使用HTMLParser解析HTML页面的Java代码示例: ```java import org.htmlparser.*; import org.htmlparser.filters.*; import org.htmlparser.nodes.*; import org.htmlparser.tags.*; import org....

    Html解析助手htmlparser.jar

    3. **解析HTML**:调用解析器的`parse`方法,传入HTML源码或输入流,开始解析过程。 4. **处理解析事件**:注册事件处理器,当解析到特定元素时执行相应的代码逻辑。 5. **获取结果**:解析完成后,可以遍历解析树,...

    Java正则表达式详解+基于HTMLParser解析HTML网页

    如何在Java程序中利用正则表达式实现对字符串的解析.另外,HTMLParser是一款很强大的对HTML网页进行解析的工具,其中大量地用到正则表达式.

Global site tag (gtag.js) - Google Analytics