写这个的时候居然没有看到原来CSDN已经有这个功能了,写完代码了突然发现原来早就已经有了。

现把代码贴出来吧,虽然有很多解析HTML的开源类库如:http://htmlagilitypack.codeplex.com/,但我一直习惯于正则匹配。

截图:

呵呵,起码还能看吧@——#

 private void button1_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(txtCsdnUrl.Text.Trim()))
{
string url = txtCsdnUrl.Text.Trim();
string htmlSource = string.Empty;
htmlSource = GetHtmlSource(url);
int pageCount = GetPageCount(htmlSource);
string context = string.Empty; if (pageCount > )
{
for (int i = ; i <= pageCount; i++)
{
htmlSource = GetHtmlSource(url + "?page=" + i); context+= GetLZArticle(htmlSource);
}
}
else
{
context += GetLZArticle(htmlSource);
} richTextBox1.Text = context; }
else
{
MessageBox.Show("请输入地址");
}
} /// <summary>
/// 获取源代码
/// </summary>
/// <param name="Url"></param>
/// <returns></returns>
public string GetHtmlSource(string Url)
{
WebClient client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Stream data = client.OpenRead(Url);
string result = string.Empty;
using (StreamReader reader = new StreamReader(data, Encoding.UTF8))
{
result = reader.ReadToEnd();
} return result;
} /// <summary>
/// 获取贴子总页数 URL格式:http://bbs.csdn.net/topics/390730011?page=2
/// </summary>
/// <returns>返回最大页数</returns>
public int GetPageCount(string HtmlSource)
{
int pageCount = ; Regex reg = new Regex("<select class=\"jumpMenu\" name=\"jumpMenu\">(?<val>.*?)</select>", RegexOptions.Singleline | RegexOptions.IgnoreCase);
string htmlSource = HtmlSource;
Regex reg1 = new Regex("<option.*?>(?<val>.*?)</option>", RegexOptions.Singleline | RegexOptions.IgnoreCase);
int count = reg1.Matches(reg.Match(htmlSource).Groups["val"].Value).Count; int.TryParse(reg1.Matches(reg.Match(htmlSource).Groups["val"].Value)[count - ].Groups["val"].Value,
out pageCount); return pageCount;
} /// <summary>
/// 获取文章标题
/// </summary>
/// <param name="HtmlSource">网页内容</param>
/// <returns></returns>
public string GetArticleTitle(string HtmlSource)
{
string title = string.Empty; Regex reg = new Regex("<span class=\"title text_overflow\">(?<title>.*?)</span>", RegexOptions.Singleline | RegexOptions.IgnoreCase); title = reg.Match(HtmlSource).Groups["title"].Value; return title;
} public string GetAuthorName(string HtmlSource)
{
string result = string.Empty; Regex regex = new Regex("<a class=\"p-author\" href=\"#\">(?<value>.*?)</a>"); result = regex.Match(HtmlSource).Groups["value"].Value; return result;
} public string GetLZArticle(string HtmlSource)
{ string result = string.Empty;
string authorName = GetAuthorName(HtmlSource); Regex regex = new Regex("<td valign=\"top\" class=\"post_info .*?\" data-username=\"" + authorName + "\".*?>.*?<div class=\"post_body\">(?<value>.*?)</div>.*?</td>", RegexOptions.Singleline | RegexOptions.IgnoreCase); for (int i = ; i < regex.Matches(HtmlSource).Count; i++)
{
result += regex.Matches(HtmlSource)[i].Groups["value"].Value;
result += "--------------------分隔线--------------------";
}
return result.Trim().Replace("<br />","\r\n");
}

代码都在这里了。

随手正则写的 CSDN【只看楼主】功能的更多相关文章

  1. 开发快很重要——如果只看法语或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦(Google也是这个看法)

    开发快很重要——如果只看语法或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦,太慢了,太麻烦了,虽然在反复调试和优化之后,最后产品的结果可能还不错. Delphi的最大特 ...

  2. css知识笔记:水平垂直居中(别只看,请实操!!!)

    css实现元素的水平垂直居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目 ...

  3. css知识笔记:垂直居中(别只看,请实操!!!)

    css实现元素的垂直居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目的, ...

  4. css知识笔记:水平居中(别只看,请实操!!!)

    css实现元素的水平居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目的, ...

  5. C语言 不看怎么存,只看怎么读 ,短字节长字节之间的转换

    不看怎么存,只看怎么读 e.g. int a = 010; //8以8进制存 int b = 8;//8以10进制存 printf("%d %d\n",a,b); 以十进制取 a和 ...

  6. CSDN管理员看过来

    CSDN管理员看过来 你好.CSDN管理员,我想我被特殊对待了.我看了一些人的博客.终于发现仅仅有我博客的数据有异常.这算是给我的惊喜吗? 言归正传,我发现我博客上两个地方出现的文章的总数对不上.原创 ...

  7. 写给非专业人士看的 *** 简介(同时也解释了GFW )

    写给非专业人士看的 *** 简介 这个文章来源于一个朋友在***的过程中,搞不清楚 *** 的配置问题,在这里我想按照我对 *** 的理解简单梳理一下,以便一些非专业人士也能了解 long long ...

  8. windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看

    windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看 1. 新建excel表格 A B C D E 姓 名 全名 登录名 密码 李 四 李四 李四 test123!@ ...

  9. 成功的背后!(给所有IT人)----转载:来自CSDN第一名博主

    转载:来自CSDN第一名博主:http://blog.csdn.net/phphot/article/details/2187505 放在这里激励你我! 正文: 成功的背后,有着许多不为人知的故事,而 ...

随机推荐

  1. laydate 显示结束时间不小于开始时间

    jsp: <div class="form-group">    <label >交易时间:</label>        <input ...

  2. 独立安装Oracle Hyperion Enterprise Performance Management 验证过程

    在安装EPM的过程中,都是安装既定的操作手册进行,只是一个过程的重复,对自己安装不会留下深刻的印象.根据自己学习体会,制定安装步骤,去验证自己学习过程中的体会,加深学习印象,解决安装中遇到的问题,模仿 ...

  3. tp3.2.3自定义全局函数的使用

    全局函数的定义,好处就是我们可以跨文件使用,而且调用方式可以直接调用,十分方便,在这里做个小记录 1.在Application/Home/Common目录下面新建一个名为function.php的文件 ...

  4. Redis多机数据库

    复制 PSYNC命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式: ·其中完整重同步用于处理初次复制情况:完 ...

  5. 知名nodeJS框架Express作者宣布弃nodeJS投Go

    知名 nodeJS 框架 Express 的作者 TJ Holowaychuk 在 Twitter 发推并链接了自己的一篇文章,宣布弃 nodeJS 投 Go. 他给出的理由是:Go 语言和 Rust ...

  6. 利用Python实现 队列的算法

    以下内容都是来自“悟空“大神的讲解,听他的视频课,利用Python实现堆栈的算法,自己做了一些小总结,可能会存在自己理解的一些误区, 1.栈的实现 队列的特征是先进先出,同我们生活中的队列具有相同的特 ...

  7. 复习C++_基础、函数、数组、字符串

    程序的开发过程 程序 源程序:用源语言写的,有待翻译的程序: 目标程序:源程序通过翻译程序加工以后生成的机器语言程序: 可执行程序:连接目标程序以及库中的某些文件,生成的一个可执行文件,例如Windo ...

  8. 更换PostgreSql的data文件夹并重新服务器(此方法同样适用于系统崩溃后,找回数据的操作)

    *如果是系统崩溃,需要找回数据,PostgreSQL安装目录的data文件夹要存在 1.备份PostgreSQL安装目录到其他目录下 2.停止Postgres服务,可以在运行中输入services.m ...

  9. Luogu [P1958] 上学路线_NOI导刊2009普及(6)

    上学路线_NOI导刊2009普及(6) 题目详见:上学路线_NOI导刊2009普及(6) 这是一道基础的DFS(深搜)题,堪称模板,是新手练习搜索与回溯的好题选. 大致思路:从(1,1)开始搜索,每次 ...

  10. Drupal7新装一个主题时页面白屏,如何设置一个默认主题?

    问题: 请问我不小心退出登陆了 但这个主题没有登录口 而且之前不知道为什么我其他界面都不能显示内容所以 ?q=user 也不行,怎么办呢?看网上说更换默认主题 去variable表里把默认主题换了,我 ...