写这个的时候居然没有看到原来CSDN已经有这个功能了,写完代码了突然发现原来早就已经有了。
现把代码贴出来吧,虽然有很多解析HTML的开源类库如:http://htmlagilitypack.codeplex.com/,但我一直习惯于正则匹配。
截图:
呵呵,起码还能看吧@——#
1PRivatevoidbutton1_Click(objectsender, EventArgs e)2{3if(!string.IsNullOrEmpty(txtCsdnUrl.Text.Trim()))4{5stringurl =txtCsdnUrl.Text.Trim();6stringhtmlSource =string.Empty;7htmlSource =GetHtmlSource(url);8intpageCount =GetPageCount(htmlSource);9stringcontext =string.Empty;1011if(pageCount >1)12{13for(inti =1; i <= pageCount; i++)14{15htmlSource = GetHtmlSource(url +"?page="+i);1617context+=GetLZArticle(htmlSource);18}19}20else21{22context +=GetLZArticle(htmlSource);23}2425richTextBox1.Text =context;2627}28else29{30MessageBox.Show("请输入地址");31}32}3334///<summary>35///获取源代码36///</summary>37///<param name="Url"></param>38///<returns></returns>39publicstringGetHtmlSource(stringUrl)40{41WebClient client =newWebClient();42client.Headers.Add("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");43Stream data =client.OpenRead(Url);44stringresult =string.Empty;45using(StreamReader reader =newStreamReader(data, Encoding.UTF8))46{47result =reader.ReadToEnd();48}4950returnresult;51}5253///<summary>54///获取贴子总页数 URL格式:http://bbs.csdn.net/topics/390730011?page=255///</summary>56///<returns>返回最大页数</returns>57publicintGetPageCount(stringHtmlSource)58{59intpageCount =0;6061Regex reg =newRegex("<select class=\"jumpMenu\" name=\"jumpMenu\">(?<val>.*?)</select>", RegexOptions.Singleline |RegexOptions.IgnoreCase);62stringhtmlSource =HtmlSource;63Regex reg1 =newRegex("<option.*?>(?<val>.*?)</option>", RegexOptions.Singleline |RegexOptions.IgnoreCase);64intcount = reg1.Matches(reg.Match(htmlSource).Groups["val"].Value).Count;6566int.TryParse(reg1.Matches(reg.Match(htmlSource).Groups["val"].Value)[count -1].Groups["val"].Value,67outpageCount);6869returnpageCount;70}7172///<summary>73///获取文章标题74///</summary>75///<param name="HtmlSource">网页内容</param>76///<returns></returns>77publicstringGetArticleTitle(stringHtmlSource)78{79stringtitle =string.Empty;8081Regex reg =newRegex("<span class=\"title text_overflow\">(?<title>.*?)</span>", RegexOptions.Singleline |RegexOptions.IgnoreCase);8283title = reg.Match(HtmlSource).Groups["title"].Value;8485returntitle;86}878889publicstringGetAuthorName(stringHtmlSource)90{91stringresult =string.Empty;9293Regex regex =newRegex("<a class=\"p-author\" href=\"#\">(?<value>.*?)</a>");9495result = regex.Match(HtmlSource).Groups["value"].Value;9697returnresult;98}99100publicstringGetLZArticle(stringHtmlSource)101{102103stringresult =string.Empty;104stringauthorName =GetAuthorName(HtmlSource);105106Regex regex =newRegex("<td valign=\"top\" class=\"post_info .*?\" data-username=\""+ authorName +"\".*?>.*?<div class=\"post_body\">(?<value>.*?)</div>.*?</td>", RegexOptions.Singleline |RegexOptions.IgnoreCase);107108for(inti =0; i < regex.Matches(HtmlSource).Count; i++)109{110result += regex.Matches(HtmlSource)[i].Groups["value"].Value;111result +="--------------------分隔线--------------------";112}113returnresult.Trim().Replace("<br />","\r\n");114}
代码都在这里了。