编程目标:搜索指定关键字,获取帖子数量
例如,搜索“小学教育”,得出结果:
结果:找到“小学教育”相关内容 20 个
我只要取得“20”这个数值。
思路:
第一步,取得html源码;
第二步,分析源码,使用正则表达式取得数值。
代码如下:
private void HuoQu2(string MyWeb_URL2)
{
WebClient MyWeb_Client = new WebClient();
//获取系统凭证
MyWeb_Client.Credentials = CredentialCache.DefaultCredentials;
//DownloadData 下载指定URL资源
byte[] MyWeb_b = MyWeb_Client.DownloadData(MyWeb_URL2);
string MyWeb_str = Encoding.Default.GetString(MyWeb_b);
//去除html标记
//MyWeb_str = Regex.Replace(MyWeb_str, @"<[^>]+>|</[^>]+>", "").Trim();
this.textBox2.Text = MyWeb_str;
//找到搜索结果
Regex r4 = new Regex(@"<h2>(?<content>[\s\S]*?)</h2>", RegexOptions.Singleline);
MatchCollection mc = r4.Matches(MyWeb_str);
foreach (Match var in mc)
{
//Console.WriteLine(var.Result("${content}"));
this.textBox3.AppendText((var.Result("${content}")).ToString());
}
//另外一种方法
Regex r = new Regex("(\bh2\b(?=d+)\bh2\b)"); // 定义一个Regex对象实例
Match m = r.Match(MyWeb_str); // 在字符串中匹配
if (m.Success)
{
this.textBox1.Text = m.Value.ToString();
//this.textBox3.Text = (m.Index).ToString(); //输入匹配字符的位置
}
}
private void button3_Click(object sender, EventArgs e)
{
string surl = "http://bbs.huainet.com/search.php?mod=forum&searchid=136&orderby=lastpost&ascdesc=desc&searchsubmit=yes&kw=%D0%A1%D1%A7%BD%CC%D3%FD";
HuoQu2(surl);
//HuoQu2(this.textBox1.Text.Trim());
}
遇到问题:
1,这个正则表达式应如何写?
2,Discuz!X2论坛是php编写的,搜索时用的是searchid这个参数,这个参数是变化的,今天searchid=136是搜索“小学教育”,明天可能就是“电动车”了。如果不用这个参数,那么获得的就是那个搜索的提交页面,而非搜索结果了。
基于以上两个问题,这样的程序到底该如何写?
小弟初学C#,只懂点asp,不懂php,诸多疑惑望各路高人不吝赐教。
10 个解决方案
#1
http://bbs.huainet.com/search.php?mod=forum&searchid=531&orderby=lastpost&ascdesc=desc&searchsubmit=yes&kw=%D0%A1%D1%A7%BD%CC%D3%FD
你可以看一下她的url 的这块kw=%D0%A1%D1%A7%BD%CC%D3%FD
kw就是keyword的缩写吧,后面的就是你搜索的关键词了
HttpUtility.UrlEncode(input,Encoding.GetEncoding("gbk"))
#2
它那个是C#写的,ASP.NET?
#3
string MyWeb_str = Encoding.Default.GetString(MyWeb_b);
//去除html标记
//MyWeb_str = Regex.Replace(MyWeb_str, @"<[^>]+>|</[^>]+>", "").Trim();
//this.textBox2.Text = MyWeb_str;
//找到搜索结果
Regex r4 = new Regex(@"<h2>[\s\S]*?(\d+)[\s\S]*?</h2>", RegexOptions.Multiline);
string search_result = r4.Match(MyWeb_str).Value;//<h2>结果: <em>找到 “<span class=\"emfont\">小学教育</span>” 相关内容 20 个</em> </h2>
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value??"0");//20
#4
你这里面的那两个问号 是什么意思?
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value ??"0");//20
#5
这样写也许你就明白了:
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":4.Match(MyWeb_str).Groups[1].Value);//20
#6
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":r4.Match(MyWeb_str).Groups[1].Value);
#7
哦。也就是当条件等于一个否定值时,可以这么写。
要是
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":"1";
还能这样写不?
#8
变量定义中含有两个问号,意思是取所赋值??左边的,如果左边为null,取所赋值??右边的。
就是如果为null,则运行后面的,否则返回前面的。
obj = obj1 ?? new Object()//等价于:
if (obj == null)
obj = new Object();
else
obj = obj1;
#9
哦,这样啊。谢谢两位了。
#10
感谢各位的回答,正则表达式的问题已经解决。先结贴。关于searchid和kw的问题,等会我再重新开个贴问吧。
#1
http://bbs.huainet.com/search.php?mod=forum&searchid=531&orderby=lastpost&ascdesc=desc&searchsubmit=yes&kw=%D0%A1%D1%A7%BD%CC%D3%FD
你可以看一下她的url 的这块kw=%D0%A1%D1%A7%BD%CC%D3%FD
kw就是keyword的缩写吧,后面的就是你搜索的关键词了
HttpUtility.UrlEncode(input,Encoding.GetEncoding("gbk"))
#2
它那个是C#写的,ASP.NET?
#3
string MyWeb_str = Encoding.Default.GetString(MyWeb_b);
//去除html标记
//MyWeb_str = Regex.Replace(MyWeb_str, @"<[^>]+>|</[^>]+>", "").Trim();
//this.textBox2.Text = MyWeb_str;
//找到搜索结果
Regex r4 = new Regex(@"<h2>[\s\S]*?(\d+)[\s\S]*?</h2>", RegexOptions.Multiline);
string search_result = r4.Match(MyWeb_str).Value;//<h2>结果: <em>找到 “<span class=\"emfont\">小学教育</span>” 相关内容 20 个</em> </h2>
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value??"0");//20
#4
你这里面的那两个问号 是什么意思?
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value ??"0");//20
#5
这样写也许你就明白了:
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":4.Match(MyWeb_str).Groups[1].Value);//20
#6
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":r4.Match(MyWeb_str).Groups[1].Value);
#7
哦。也就是当条件等于一个否定值时,可以这么写。
要是
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":"1";
还能这样写不?
#8
变量定义中含有两个问号,意思是取所赋值??左边的,如果左边为null,取所赋值??右边的。
就是如果为null,则运行后面的,否则返回前面的。
obj = obj1 ?? new Object()//等价于:
if (obj == null)
obj = new Object();
else
obj = obj1;
#9
哦,这样啊。谢谢两位了。
#10
感谢各位的回答,正则表达式的问题已经解决。先结贴。关于searchid和kw的问题,等会我再重新开个贴问吧。