随手正则写的 CSDN【只看楼主】功能
写这个的时候居然没有看到原来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【只看楼主】功能的更多相关文章
- 开发快很重要——如果只看法语或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦(Google也是这个看法)
开发快很重要——如果只看语法或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦,太慢了,太麻烦了,虽然在反复调试和优化之后,最后产品的结果可能还不错. Delphi的最大特 ...
- css知识笔记:水平垂直居中(别只看,请实操!!!)
css实现元素的水平垂直居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目 ...
- css知识笔记:垂直居中(别只看,请实操!!!)
css实现元素的垂直居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目的, ...
- css知识笔记:水平居中(别只看,请实操!!!)
css实现元素的水平居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目的, ...
- C语言 不看怎么存,只看怎么读 ,短字节长字节之间的转换
不看怎么存,只看怎么读 e.g. int a = 010; //8以8进制存 int b = 8;//8以10进制存 printf("%d %d\n",a,b); 以十进制取 a和 ...
- CSDN管理员看过来
CSDN管理员看过来 你好.CSDN管理员,我想我被特殊对待了.我看了一些人的博客.终于发现仅仅有我博客的数据有异常.这算是给我的惊喜吗? 言归正传,我发现我博客上两个地方出现的文章的总数对不上.原创 ...
- 写给非专业人士看的 *** 简介(同时也解释了GFW )
写给非专业人士看的 *** 简介 这个文章来源于一个朋友在***的过程中,搞不清楚 *** 的配置问题,在这里我想按照我对 *** 的理解简单梳理一下,以便一些非专业人士也能了解 long long ...
- windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看
windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看 1. 新建excel表格 A B C D E 姓 名 全名 登录名 密码 李 四 李四 李四 test123!@ ...
- 成功的背后!(给所有IT人)----转载:来自CSDN第一名博主
转载:来自CSDN第一名博主:http://blog.csdn.net/phphot/article/details/2187505 放在这里激励你我! 正文: 成功的背后,有着许多不为人知的故事,而 ...
随机推荐
- hibernate课程 初探单表映射1-8 hibernate持久化类
java beans 的设计原则 1 公有的类 2 共有不带参数构造方法 3 私有属性 4 属性setter/getter方法 Studnet类: package com.ddwei.student; ...
- 从零开始的全栈工程师——js篇2.11(原型)
原型 原型分析 1.每个 函数数据类型(普通函数,类)都有一个prototype属性 并且这个属性是一个对象数据类型2.每个Prototype上都有一个constructor属性 并且这个属性值是当前 ...
- uLua学习之创建游戏对象(二)
前言 上节,刚刚说到创建一个“HelloWorld”程序,大家想必都对uLua有所了解了,现在我们一步步地深入学习.在有关uLua的介绍中(在这里),我们可以发现它使用的框架是Lua + LuaJIT ...
- 命令行启动mysql服务
在<计算机网络>课程中曾学过net命令,可以用于启动后台服务.在mysql中,net命令用于启动后台服务器进程mysqld,即后台服务. 不过,如果在普通用户模式下net start my ...
- python_50_函数与函数式编程
import time def logger(): """追加写""" time_format='%Y-%m-%d %X'#年-月-日 小时 ...
- Python监控日志中经常访问的ip
一.需求:每分钟检查一次日志文件,如果这一分钟内同一个ip请求次数超过200次,加入黑名单 1.日志文件中,每一行的格式为:XXX.XXX.XXX.XXX - - [04/Jun/2017:05:25 ...
- C#逻辑运算符
一.C#逻辑运算符 C#语言的逻辑运算符是对变量的值.表达式的运算结果进行比较,基比较结果为True或False. 二.示例 using System;using System.Collections ...
- javase(9)_java io系统
一.File类 1.file既可以代表一个特定文件的名称,又可以代表一个目录下的一组文件的名称,实际上,FilePath对这个类来说是个更好的名字.2.目录列表器例: import java.io.F ...
- angular实现全屏显示效果
- iOS进阶面试题
1. 风格纠错题 修改完的代码: 修改方法有很多种,现给出一种做示例: // .h文件 // http://weibo.com/luohanchenyilong/ // https://github. ...