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 <wbr></wbr>= <wbr></wbr>New <wbr></wbr>WebClient()<br />
Dim <wbr></wbr>myDatabuffer <wbr></wbr>As <wbr></wbr>Byte() <wbr></wbr>= <wbr></wbr>wc.DownloadData("http://www.aspx.cn/comm/dotnetbbs/Showtopic.aspx?Forum_ID=5&Id=25994&PPage=1")</span></p>
<p><span>首先Dim是个什么东东不晓得了就 但是我懂得Byte要转换类型 这个貌似不是我所喜欢的直接pass掉连实验都懒得实验了。(测试了下,不晓得怎么用。)·····明天继续吧 这几天太累了,总是思考自己要不要去培训。欠债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的地位。以后再补充吧
浙公网安备 33010602011771号