C#抓取网页数据 解析标题描述图片等信息 去除HTML标签
一、首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为String,以便于对其操作,实例如下:
privatestaticstringGetPageData(stringurl)
{
if(url==null||url.Trim()=="")
returnnull;
WebClientwc=newWebClient();
wc.Credentials=CredentialCache.DefaultCredentials;
Byte[]pageData=wc.DownloadData(url);
returnEncoding.Default.GetString(pageData);//.ASCII.GetString
}
二、得到了数据的字符串形式,然后可以对网页进行解析了(其实就是对字符串的各种操作和正则表达式的应用):
常用的的解析还有以下几种:
1.获取标题
MatchTitleMatch=Regex.Match(strResponse,"<title>([^<]*)</title>",RegexOptions.IgnoreCase|RegexOptions.Multiline); title=TitleMatch.Groups[1].Value;
2.获取描述信息
MatchDesc=Regex.Match(strResponse,"<metaname=\"DESCRIPTION\"content=\"([^<]*)\">",RegexOptions.IgnoreCase|RegexOptions.Multiline); strdesc=Desc.Groups[1].Value;
3.获取图片
publicclassHtmlHelper
{
///<summary>
///HTML中提取图片地址
///</summary>
publicstaticList<string>PickupImgUrl(stringhtml)
{
RegexregImg=newRegex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>",RegexOptions.IgnoreCase);
MatchCollectionmatches=regImg.Matches(html);
List<string>lstImg=newList<string>();
foreach(Matchmatchinmatches)
{
lstImg.Add(match.Groups["imgUrl"].Value);
}
returnlstImg;
}
///<summary>
///HTML中提取图片地址
///</summary>
publicstaticstringPickupImgUrlFirst(stringhtml)
{
List<string>lstImg=PickupImgUrl(html);
returnlstImg.Count==0?string.Empty:lstImg[0];
}
}
4.去除Html标签
privatestringStripHtml(stringstrHtml)
{
RegexobjRegExp=newRegex("<(.|\n)+?>");
stringstrOutput=objRegExp.Replace(strHtml,"");
strOutput=strOutput.Replace("<","<");
strOutput=strOutput.Replace(">",">");
returnstrOutput;
}
有些例外会使得去除不干净,所以建议连续两次转化。这样将Html标签转化为了空格。太多连续的空格会影响之后对字符串的操作。所以再加入这样的语句:
//把所有空格变为一个空格 Regexr=newRegex(@"\s+"); wordsOnly=r.Replace(strResponse,""); wordsOnly.Trim();