<@Aattention Content="本Blog原创文章,转载或引用请注明转载" From="Robby.cnblogs.com"@>
由于自己的搜索引擎中做到了这一块内容,所以今天说说如何抓取网页数据、分析并且去除Html标签,给大家提供一个参考。我的平台是Visual Studio2005,C#。
—————————————————————割—————————————————————————
首先将网页内容整个抓取下来,这个我就不说了,不是本次话题的重点。假设抓取的数据放在RecvBuffer这个byte[]中(数据从网络上传输过来时不是字符串的形式而是byte),那么我们的第一步就是将RecvBuffer转化为String,以便于对其操作,实例如下:
strResponse += Encoding.ASCII.GetString(RecvBuffer, 0 , nBytes);
得到了数据的字符串形式,然后可以对网页进行解析了(其实就是对字符串的各种操作和正则表达式的应用)。下面我以几个例子来说明对网页数据的解析:
// 此处尚需扩展,还有某些形式的链接不被识别
string strRef = @" (href|HREF|src|SRC|action|ACTION|Action)[ ]*=[ ]*[""'][^""'#>]+[""'] " ;
MatchCollection matches = new Regex(strRef).Matches(strResponse);
strStatus += " 找到: " + matches.Count + " 个链接/r/n " ;
上面的例子将网页中的链接解析出来,strRef变量表示了正则表达式的模式,变量matches表示符合匹配的项目的集合,后面的Regex(strRef).Matches(strResponse)就是创建正则规则使得strResponse里符合strRef模式的字符串都返回。然后调用matches的变量就可以取得各种信息了。
当然,这里只能识别一些基本的链接形式,像script中的链接和一些不带“”的链接都没有被支持,这个的扩展还是蛮简单的。
再举几个更简单点的解析的例子,大家学习学习:
Match TitleMatch = Regex.Match(strResponse, " <title>([^<]*)</title> " , RegexOptions.IgnoreCase | RegexOptions.Multiline);
title = TitleMatch.Groups[ 1 ].Value;
// 获取描述信息
Match Desc = Regex.Match(strResponse, " <Meta name=/ " DESCRIPTION/ " content=/ " ([ ^< ] * )/ " > " , RegexOptions.IgnoreCase | RegexOptions.Multiline);
strdesc = Desc.Groups[ 1 ].Value;
// 获取网页的大小
size = strResponse.Length;
—————————————————————割—————————————————————————
好了,下面说一下如何去除Html标签,这个想必有很多初学者很需要。其实还是正则表达式和字符串基本操作的应用,由于这个功能还是比较常用的,所以例子写成了函数,便于调用:
/// 将Html标签转化为空格
/// </summary>
/// <param name="strHtml"> 待转化的字符串 </param>
/// <returns> 经过转化的字符串 </returns>
private string stripHtml( string strHtml)
{
Regex objRegExp = new Regex( " <(.|/n)+?> " );
string strOutput = objRegExp.Replace(strHtml, "" );
strOutput = strOutput.Replace( " < " , " < " );
strOutput = strOutput.Replace( " > " , " > " );
return strOutput;
}
ok,这样一来Html标签就基本没了,但是有些例外会使得去除不干净,所以建议连续两次转化,这样就搞定了。但是还没结束,如果你留意的话,可以看到上面的函数其实是将Html标签转化为了空格。太多连续的空格会影响之后对字符串的操作。所以再加入这样的语句:
Regex r = new Regex( @" /s+ " );
wordsOnly = r.Replace(strResponse, " " );
wordsOnly.Trim();
好了,大功告成,这里的wordsOnly便是我们最终的成果----去除了Html标签,并去除了多余空格的字符串。
希望对大家有用!