Discuz!X2论坛搜索及正则表达式?

时间:2021-09-01 08:22:21
网站:http://bbs.huainet.com/search.php?mod=forum

编程目标:搜索指定关键字,获取帖子数量

例如,搜索“小学教育”,得出结果:
 结果:找到“小学教育”相关内容 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


引用 3 楼 return_false 的回复:
C# code

 string MyWeb_str = Encoding.Default.GetString(MyWeb_b);
                //去除html标记
                //MyWeb_str = Regex.Replace(MyWeb_str, @"<[^>]+>|</[^>]+>", "").Trim();
              ……


你这里面的那两个问号 是什么意思?
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value ??"0");//20

#5


引用 4 楼 soonfei 的回复:
引用 3 楼 return_false 的回复:
C# code

string MyWeb_str = Encoding.Default.GetString(MyWeb_b);
//去除html标记
//MyWeb_str = Regex.Replace(MyWeb_str, @"<[^>]+>|</[^>]+>", "").Trim();
……


你这里面的那两个问号 是……

这样写也许你就明白了:
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


引用 6 楼 q107770540 的回复:
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":r4.Match(MyWeb_str).Groups[1].Value);

哦。也就是当条件等于一个否定值时,可以这么写。
要是
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":"1";
还能这样写不?

#8


引用 7 楼 soonfei 的回复:
引用 6 楼 q107770540 的回复:
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":r4.Match(MyWeb_str).Groups[1].Value);

哦。也就是当条件等于一个否定值时,可以这么写。
要是
int num = int.Parse(r4.Match(MyWeb_str).……


变量定义中含有两个问号,意思是取所赋值??左边的,如果左边为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


引用 3 楼 return_false 的回复:
C# code

 string MyWeb_str = Encoding.Default.GetString(MyWeb_b);
                //去除html标记
                //MyWeb_str = Regex.Replace(MyWeb_str, @"<[^>]+>|</[^>]+>", "").Trim();
              ……


你这里面的那两个问号 是什么意思?
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value ??"0");//20

#5


引用 4 楼 soonfei 的回复:
引用 3 楼 return_false 的回复:
C# code

string MyWeb_str = Encoding.Default.GetString(MyWeb_b);
//去除html标记
//MyWeb_str = Regex.Replace(MyWeb_str, @"<[^>]+>|</[^>]+>", "").Trim();
……


你这里面的那两个问号 是……

这样写也许你就明白了:
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


引用 6 楼 q107770540 的回复:
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":r4.Match(MyWeb_str).Groups[1].Value);

哦。也就是当条件等于一个否定值时,可以这么写。
要是
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":"1";
还能这样写不?

#8


引用 7 楼 soonfei 的回复:
引用 6 楼 q107770540 的回复:
int num = int.Parse(r4.Match(MyWeb_str).Groups[1].Value==null?"0":r4.Match(MyWeb_str).Groups[1].Value);

哦。也就是当条件等于一个否定值时,可以这么写。
要是
int num = int.Parse(r4.Match(MyWeb_str).……


变量定义中含有两个问号,意思是取所赋值??左边的,如果左边为null,取所赋值??右边的。

就是如果为null,则运行后面的,否则返回前面的。


obj = obj1 ?? new Object()//等价于:
if (obj == null)  
obj = new Object();
else  
obj = obj1;

#9


哦,这样啊。谢谢两位了。

#10


感谢各位的回答,正则表达式的问题已经解决。先结贴。关于searchid和kw的问题,等会我再重新开个贴问吧。