在搜索引擎的开发中,我们需要对网页的Html内容进行检索,难免的就需要对Html进行解析。拆分每一个节点并且获取节点间的内容。此文介绍两种C#解析Html的方法。
第一种方法:
用System.Net.WebClient下载Web Page存到本地文件或者String中,用正则表达式来分析。这个方法可以用在Web Crawler等需要分析很多Web Page的应用中。
估计这也是大家最直接,最容易想到的一个方法。
转自网上的一个实例:所有的href都抽取出来:
usingSystem;
usingSystem.Net;
usingSystem.Text;
usingSystem.Text.RegularExpressions;
namespaceHttpGet
{
classClass1
{
[STAThread]
staticvoidMain(string[]args)
{
System.Net.WebClientclient=newWebClient();
byte[]page=client.DownloadData("http://www.google.com");
stringcontent=System.Text.Encoding.UTF8.GetString(page);
stringregex="href=[\\\"\\\'](http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?[\\\"\\\']";
Regexre=newRegex(regex);
MatchCollectionmatches=re.Matches(content);
System.Collections.IEnumeratorenu=matches.GetEnumerator();
while(enu.MoveNext()&&enu.Current!=null)
{
Matchmatch=(Match)(enu.Current);
Console.Write(match.Value+"\r\n");
}
}
}
}
一些爬虫的HTML解析中也是用的类似的方法。
第二种方法:
利用Winista.Htmlparser.Net 解析Html。这是.NET平台下解析Html的开源代码,网上有源码下载,百度一下就能搜到,这里就不提供了。并且有英文的帮助文档。找不到的留下邮箱。
个人认为这是.net平台下解析html不错的解决方案,基本上能够满足我们对html的解析工作。
自己做了个实例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingWinista.Text.HtmlParser;
usingWinista.Text.HtmlParser.Lex;
usingWinista.Text.HtmlParser.Util;
usingWinista.Text.HtmlParser.Tags;
usingWinista.Text.HtmlParser.Filters;
namespaceHTMLParser
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
AddUrl();
}
privatevoidbtnParser_Click(objectsender,EventArgse)
{
#region获得网页的html
try
{
txtHtmlWhole.Text="";
stringurl=CBUrl.SelectedItem.ToString().Trim();
System.Net.WebClientaWebClient=newSystem.Net.WebClient();
aWebClient.Encoding=System.Text.Encoding.Default;
stringhtml=aWebClient.DownloadString(url);
txtHtmlWhole.Text=html;
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
#endregion
#region分析网页html节点
Lexerlexer=newLexer(this.txtHtmlWhole.Text);
Parserparser=newParser(lexer);
NodeListhtmlNodes=parser.Parse(null);
this.treeView1.Nodes.Clear();
this.treeView1.Nodes.Add("root");
TreeNodetreeRoot=this.treeView1.Nodes[0];
for(inti=0;i<htmlNodes.Count;i++)
{
this.RecursionHtmlNode(treeRoot,htmlNodes[i],false);
}
#endregion
}
privatevoidRecursionHtmlNode(TreeNodetreeNode,INodehtmlNode,boolsiblingRequired)
{
if(htmlNode==null||treeNode==null)return;
TreeNodecurrent=treeNode;
TreeNodecontent;
//currentnode
if(htmlNodeisITag)
{
ITagtag=(htmlNodeasITag);
if(!tag.IsEndTag())
{
stringnodeString=tag.TagName;
if(tag.Attributes!=null&&tag.Attributes.Count>0)
{
if(tag.Attributes["ID"]!=null)
{
nodeString=nodeString+"{id=\""+tag.Attributes["ID"].ToString()+"\"}";
}
if(tag.Attributes["HREF"]!=null)
{
nodeString=nodeString+"{href=\""+tag.Attributes["HREF"].ToString()+"\"}";
}
}
current=newTreeNode(nodeString);
treeNode.Nodes.Add(current);
}
}
//获取节点间的内容
if(htmlNode.Children!=null&&htmlNode.Children.Count>0)
{
this.RecursionHtmlNode(current,htmlNode.FirstChild,true);
content=newTreeNode(htmlNode.FirstChild.GetText());
treeNode.Nodes.Add(content);
}
//thesiblingnodes
if(siblingRequired)
{
INodesibling=htmlNode.NextSibling;
while(sibling!=null)
{
this.RecursionHtmlNode(treeNode,sibling,false);
sibling=sibling.NextSibling;
}
}
}
privatevoidAddUrl()
{
CBUrl.Items.Add("http://www.hao123.com");
CBUrl.Items.Add("http://www.sina.com");
CBUrl.Items.Add("http://www.heuet.edu.cn");
}
}
}
运行效果:
实现取来很容易,结合Winista.Htmlparser源码很快就可以实现想要的效果。
小结:
简单介绍了两种解析Html的方法,大家有什么其他好的方法还望指教。
分享到:
相关推荐
HtmlAgilityPack 解析html,很方便很强大。
C#解析html类库NSoup.dll 调用代码如下: string html = "<html><head><title>First!</title></head><body><p title='test'>First post!</p></body></html>"; Document...
C#解析Json数据(.html),C#解析Json数据(.html)(网页链接)
C# HTMLParser HTML解析类库(含Demo,手册)
NULL 博文链接:https://hipeace87.iteye.com/blog/773804
C# 解析HTML格式字符串(HtmlAgilityPack)-附件资源
用于解析html字符串,利用XPATH语法读取 格式化后的html
能够快速解析HTML源码,找到指定位置处的的Url 用法如下: var list = new List(); HtmlTag tag; while (!parser.Eof) { if (!parser.ParseNext("dl", out tag)) continue; if (!(tag.Attributes.ContainsKey...
一款方便用于解析HTML代码的C# dll 程序集,内包涵各种方便快捷的操作方法,可以大大提高开发效率,可以像使用JS一样,根据id查找找指定的标签,等等。。。(纯中文注释,方便更多的开发者快速理解方法含义)
介绍c#解析HTML,操作环境是VS2010.
用System.Net.WebClient下载Web Page存到本地文件或者String中,用正则表达式来分析。这个方法可以用在Web Crawler等需要分析很多Web Page的应用中
C#如何解析HTML的介绍文档,利用了第三方类库
C# html解析
包含html页面解析的网络爬虫程序C#实现,可以将html生成树形结构,添加代码后可提取相应内容存储到数据库中,实现数据的爬取。
用Dom方式解析Html的组件
相当有用的类,操作HTML让其无所遁形,包括获取Html的内容,提取Html中img的所有内容等
c#解析复杂html专题及常见问题整理.docx
C# 手写的打印日志类,能控件日志输出项(可以控件输出日志形式[txt,html]两种形式,同时还可以控制只打印错误、信息、警告或全打印),解析JSON字符串