WinForm读取html并输出文本

<p>帮朋友做一个小东西。由于本人是初学者,毛毛都不懂得说。故研究并实现之的过程一点点写出来。</p>
<p>首先是思路:读取html 剩下的东西就简单了不管用streamReader或者是string 都可以split或者是正则表达式出自己想要的东西。那么,第一步也是最重要的一步,我们怎么去获取html的源代码。在网上找了很久(本人极度菜的说)</p>
<p>看到网上说 远程读取html的话使用 <span id="dgfiList__ctl4_Body">WebClient</span></p>
<p><span id="dgfiList__ctl4_Body">wc&nbsp;<wbr></wbr>=&nbsp;<wbr></wbr>New&nbsp;<wbr></wbr>WebClient()<br />
Dim&nbsp;<wbr></wbr>myDatabuffer&nbsp;<wbr></wbr>As&nbsp;<wbr></wbr>Byte()&nbsp;<wbr></wbr>=&nbsp;<wbr></wbr>wc.DownloadData("http://www.aspx.cn/comm/dotnetbbs/Showtopic.aspx?Forum_ID=5&amp;Id=25994&amp;PPage=1")</span></p>
<p><span>首先Dim是个什么东东不晓得了就&nbsp; 但是我懂得Byte要转换类型&nbsp; 这个貌似不是我所喜欢的直接pass掉连实验都懒得实验了。(测试了下,不晓得怎么用。)&middot;&middot;&middot;&middot;&middot;明天继续吧 这几天太累了,总是思考自己要不要去培训。欠债5w的人何苦培训呢。<br /></span></p>
<p><span>顺带说一句,原来WebBrowser就是个浏览器啊。貌似对我来说用处不是太大,我的用户不注意体验,只要效率和结果。<br /></span></p>
今天继续找,然后看到两个比较好用的方法。在这个给各位同样的菜鸟看一下。
1.webrequest(在命名空间 System.Net中)
使用Create方法初始化新实例,不能构造。
WebRequest myRequest = WebRequest.Create("http://www.contoso.com");(这是msdn给的例子)【这里给大家提个醒 初始化实例和构造是不同的,你看我这里没有用new吧 new是对方法的 什么时候有空的话  我得弄个最基础的帖子去 实例 方法 对象的不同】
构造一个新方法
 private string GetStringByUrl(string strUrl)
    {
        WebRequest wrt = WebRequest.Create(strUrl);
        WebResponse wrse = wrt.GetResponse();
        Stream strM = wrse.GetResponseStream();
        StreamReader SR = new StreamReader(strM, Encoding.GetEncoding("gb2312"));
        string strallstrm = SR.ReadToEnd();
        return strallstrm;
    }
然后引用就行了
2 .HttpWebRequest

 public static string GetPage(string url, Encoding encoding)

        {

            HttpWebRequest request = null;

            HttpWebResponse response = null;

            StreamReader reader = null;

            try

            {

                request = (HttpWebRequest)WebRequest.Create(url);

                request.UserAgent = "www.svnhost.cn";

                request.Timeout = 20000;

request.AllowAutoRedirect = false;

                response = (HttpWebResponse)request.GetResponse();

                if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)

                {

                    reader = new StreamReader(response.GetResponseStream(), encoding);

                    string html = reader.ReadToEnd();

                    return html;

                }

            }

            catch

            {

            }

            finally

            {

                if (response != null)

                {

                    response.Close();

                    response = null;

                }
                if (reader != null)

                    reader.Close();

                if (request != null)

                    request = null;

            }

           return string.Empty;

        }
第二种方法  自己测试了一下,感觉貌似效率有点低,,运行速度比较慢。可能是我的方法不对(我没用上面给的代码)
供各位查看。两种方法均转自csdn的一个博客   感谢这位大牛http://blog.csdn.net/jiang_jiajia10/archive/2008/11/18/3325407.aspx

随之而来的是接下来的悲剧。读取页面然后开始截取你所需要的。首先我要有特定特征的href。这个过程中 需要split方法。

string[] splitHerf = Regex.Split(herf, "yschttl spt", RegexOptions.IgnoreCase)代码含义我就不再说了。大家自己看文档吧。

先保存,由于自己不会正则表达式,在读取href的方法上悲剧了。继续煎熬中。

昨天晚上整到两点,实在扛不住就睡觉了。用正则表达式的话可能是我不太会的原因。又一个地方,没有弄明白。貌似正则表达式会把所有的href都过滤出来。这个可能就是不我能判断的了。而且,我不能使用group[value]进行过滤。折腾了一晚上最后还是完全使用split得到了我想要的。下面给出代码。剩下的工作,由于雅虎的搜索引擎算法问题无法实现,暂且搁置,哥去看数据结构。

1 using System;
2  using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Text;
7 using System.Windows.Forms;
8 using System.IO;
9 using System.Net;
10 using System.Text.RegularExpressions;
11 using System.Collections;
12
13 namespace 获取html_控制截取
14 {
15 public partial class Form1 : Form
16 {
17 public Form1()
18 {
19 InitializeComponent();
20 }
21 private static string GetStringByUrl(string strUrl)
22 {
23 WebRequest wrt = System.Net.WebRequest.Create(strUrl);
24 WebResponse wrse = wrt.GetResponse();
25 Stream strM = wrse.GetResponseStream();
26 StreamReader SR = new StreamReader(strM, Encoding.GetEncoding("gb2312"));
27 string strallstrm = SR.ReadToEnd();
28 return strallstrm;
29 }
30 private void button1_Click(object sender, EventArgs e)
31 {
32 string url = txt_Url.Text; ;
33 string herf = GetStringByUrl(url);
34 //string[] splitHerf = Regex.Split(herf, "yschttl spt", RegexOptions.IgnoreCase);
35 string[] splitHerf = herf.Split(new string[] { "\"yschttl spt\""},StringSplitOptions.None);
36 for (int i = 1; i < splitHerf.Length; i++)
37 {
38 //string[] splitWant = Regex.Split(splitHerf[i], "data-", RegexOptions.IgnoreCase);
39
40 string[] splitWount = splitHerf[i].Split(new string[] { "data-bk" }, StringSplitOptions.None);
41 //for (int t = 0; t < 1; t++)
42 //{
43
44 // //Regex reg = new Regex(@"(?is)<a(?:(?!href=).)*href=(['""]?)(?<url>[^""\s>]*)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>");
45 // //MatchCollection mc = reg.Matches(splitWount[1]);
46 // //foreach (Match m in mc)
47 // //{
48 // // txtEnd.Text += m.Groups["url"].Value + "\n";
49
50 // //}
51 // txtEnd.Text += sR;
52 //}
53 string[] st= splitWount[0].Split(new string[]{"href=\""},StringSplitOptions.None);
54 string[] go = st[1].Split('"');
55 string nextUrl = go[0];
56 string code = GetStringByUrl(nextUrl);
57 txtEnd.Text += go[0]+"\n";
58 }
59
60 }
61 }
62 }

实现的截图就不给了。

功能是,首先从搜索引擎上捕获排名靠前的网站,剩下的功能是捕获网站中的title keyword description 但是这部分功能我没有写。写的话也简单。不过雅虎的算法里没有keyword的地位。以后再补充吧

posted @ 2011-05-04 23:25  Starf  阅读(2164)  评论(3)    收藏  举报