winform里面网页显示指定内容
来源:互联网 发布:智能机器人编程语言 编辑:程序博客网 时间:2024/06/06 01:15
今天有个同事问了一下我,怎么在winform里面打开网页啊?我们都是基于B/S的开发,很少接触winform,所以我当时就懵了,实在不知道怎么回答,所以索性说不知道。但是我又想了想,这个应该是个很简单的功能,趁着今天工作不是很忙,我就研究一下吧。
首先,新建一个winform项目,我在想,如果想要实现打开网页功能的话,应该会有一个控件什么之类的吧?查了工具栏,真的有一个名叫 WebBrowser的家伙,应该就是这货没错了。在网上查了它的资料更加坚定了我的判断,二话不说,拖进Form里。接着,就是要显示一个网页了,要怎 么实现呢?继续查看WebBrowser都有啥属性和方法:
该表定义在ExDisp.h中,可以指定的不同值如下:
REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器
REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新
REFRESH_CONTINUE 仅作内部使用。在MSDN里写着DO NOT USE! 请勿使用
REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器 Stop相当于IE的“停止”按钮,停止当前页面及其内容的载入
控件的自动化对象 Parent返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口 Container返回WebBrowser控件容器的自动化对象。通常该值与Parent属性返回的值相同 Document为活动的文档返回自动化对象。如果HTML当前正被显示在WebBrowser中,则
Document属性提供对DHTML Object Model的访问途径 TopLevelContainer返回一个Boolean值,表明IE是否是WebBrowser控件顶层容器,是就返回true Type返回已被WebBrowser控件加载的对象的类型。例如:如果加载.doc文件,就会返
回Microsoft Word Document Left返回或设置WebBrowser控件窗口的内部左边与容器窗口左边的距离 Top返回或设置WebBrowser控件窗口的内部左边与容器窗口顶边的距离 Width返回或设置WebBrowser窗口的宽度,以像素为单位 Height返回或设置WebBrowser窗口的高度,以像素为单位 LocationName返回一个字符串,该字符串包含着WebBrowser当前显示的资源的名称,如果资源
是网页就是网页的标题;如果是文件或文件夹,就是文件或文件夹的名称 LocationURL返回WebBrowser当前正在显示的资源的URL Busy返回一个Boolean值,说明WebBrowser当前是否正在加载URL,如果返回true
就可以使用stop方法来撤销正在执行的访问操作
Title有效或改变时激发
看了以上信息后,Navigate这个方法最靠谱,所以在Form1_Load中加入了一句代码:
webBrowser1.Navigate("http://www.baidu.com/");
运行后百度的页面出来了,搞定!原来如此简单!
这么一句就搞定了,我开始不满足于现状,我想查看一下生成baidu的网页源代码,有一个属性是:DocumentText,我想应该是这个,于是我在Form1_Load加了这么一句:
this.textBox1.Text = webBrowser1.DocumentText;
运行后,发现textbox里啥都没显示,调试发现webBrowser1.DocumentText居然是空值,难道是我 DocumentText不是显示页面内容的属性?不对,我再加入webBrowser1.Document来调试,发现居然是个null值,一定是哪里 弄错了!
我仔细检查了一下,原来是我看事件不仔细,webBrowser1.DocumentText这个必须放在webBrowser1_DocumentCompleted事件中,等页面加载完成后,才能获取到网页的值,再试一下,果然成功了!
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e){ this.textBox1.Text = webBrowser1.DocumentText;}
不过……为什么会有乱码啊?!
不行,我要把乱码去掉,默认是utf-8的页面,我只要把它转换成gb2312即可,所以就不能直接webBrowser1.DocumentText,我打算采用StreamReader来转换好一些:
StreamReader getReader = new StreamReader(this.webBrowser1.DocumentStream, Encoding.GetEncoding("gb2312"));this.textBox1.Text = getReader.ReadToEnd();
OK,两句就搞定!注意哦,我这里用的是this.webBrowser1.DocumentStream
我又突发奇想,如果我只想要获取网页中的图片地址该怎么办咧?大概的思路就是从生成的网页源代码里找到img标签,并从src里取出来呗,于是有了以下代码:
StreamReader getReader = new StreamReader(this.webBrowser1.DocumentStream, Encoding.GetEncoding("gb2312")); ArrayList list = new ArrayList(); string strRegex = "<img (.|\n)+?>"; Regex regex = new Regex(strRegex, RegexOptions.IgnoreCase); MatchCollection match = regex.Matches(getReader.ReadToEnd()); int startp, endp; for (int i = 0; i < match.Count; i++) { bool flag = false; string Img = match[i].ToString(); startp = Img.ToLower().IndexOf("src=\""); if (startp != -1) { startp = startp + 5; endp = Img.ToLower().IndexOf("\"", startp + 1); Img = Img.Substring(startp, endp - startp); foreach (string str in list) { if (Img == "str" || Img == "/" || Img == "") { flag = true; break; } } if (!flag) { this.textBox1.Text += Img.ToString() + "\r\n"; } } }
输出以下结果:
http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif
http://www.baidu.com/cache/global/img/gs.gif
虽然是成功取出了图片地址,但是感觉总是写这么多代码,有点不妥,这样一种取图片的功能,我想应该是很多人都会有这种需求,应该有啥控件或插件之类的吧?再网上搜了一下,果然让我找到了一个比较好用的——HtmlAgilityPack
把HtmlAgilityPack.dll引入项目后,只要编写如下代码就能实现如上的功能:
string strImg = ""; HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(getReader.ReadToEnd()); foreach (var img in doc.DocumentNode.SelectNodes("//img")) { strImg += img.Attributes["src"].Value.ToString() + "\r\n"; }
this.textBox1.Text = strImg;
太强大了,我想HtmlAgilityPack这货的能力应该不仅仅如此,比如还可以用它来去脚本,去样式,和去注释等:
foreach (var script in doc.DocumentNode.Descendants("script").ToArray()) { script.Remove(); } foreach (var style in doc.DocumentNode.Descendants("style").ToArray()) { style.Remove(); } foreach (var comment in doc.DocumentNode.SelectNodes("//comment()").ToArray()) { comment.Remove(); }
就是如此简单,写更少的代码,做更多的事!
好了,今天就研究到这吧,不然随着深入,我会越陷越深,工作都顾不上了,就此打住吧。对于HtmlAgilityPack我想以后有时间,我会详细研究它的。
总结一下:winform这东西,我几百年都没去碰过它,不过既然碰上了,就捣腾一番,写篇文章来记录一下当时我研究了啥,为啥研究,怎么研 究,以免以后忘了。对于新事物和新问题,我都是这么去解决的,不知道有没有人和我一样,躺着也中枪?以后还有好多东西要去学习和研究,努力,加油!正能量 爆发!!嘎嘎嘎!!!
工作去……
- winform里面网页显示指定内容
- 查询内容在网页里面分页显示+跳页查看
- 【js】:js如何实现给网页某一地方显示指定内容
- 取得指定网页内容
- 获取指定网页内容
- angularjs 在 iframe 里面无法正确显示 src 指定的内容
- 将winform嵌套到指定winform里面去
- 网页显示硬盘内容
- UIwebview显示网页内容
- C#获取网页指定内容
- 取得指定文件里面的内容
- 从字符串里面匹配截取指定内容
- 【HTML】使用iframe标签显示目标网页(内容)的指定区域
- Ubuntu 显示指定某已行内容
- 修改网页页面显示内容
- ionic2 直接显示网页内容
- 解决api打开显示“已取消到该网页的导航”问题或者api里面没有内容
- C# winform控件 显示html内容
- Git中.gitignore文件无效 不起作用的解决办法
- ios多线程详解
- C++使用OLE/COM高速读写EXCEL的源码(OLE/COM)
- mybaits3.2.8 别名包扫描通配符
- Cocos2d-X游戏开发(四)
- winform里面网页显示指定内容
- 写一个获取非行间样式的函数
- 测试
- tarjan——洛谷P1262 间谍网络
- ubuntu 创建本地deb软件包时,对Release文件做gpg签名
- android 开发过程中为什么android内部类会报错,求大神们指点啊
- loadrunner: failed to deliver a p2p message from parent to ...
- PHPstorm 忽略IDE中打开的文件夹
- postgresql 日志配置