ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

   
EH云课堂-专业的职场技能充电站 限时送,魔方网表将Excel变在线系统 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 高效办公必会的Office实战技巧 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 ExcelHome出品 - VBA代码宝免费下载 13门Excel免费公开课任你学
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 免费的Excel考勤计算系统
楼主: agstick

[Excel 程序开发] [第26期]网页数据提取(已结)

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-8-27 22:31 | 显示全部楼层

本期考察的时网页数据的提取,从参赛答案来看,有不少是通过下载csv文件来提取数据,这并不

是本题的目的。这样的确很方便,但是如果网页不提供csv文件呢?
从网页提取数据主要有以下几种常用方法:
1、QueryTable
这种方法是最简单的,通过录制宏,就可以实现,缺点就是只能整个表格搞下来,不能有选择的

导入数据。
2、WebBrowser控件
这种方法是不错的方法,WebBrowser控件很灵活,可以选择只导入表格某几列的数据,使用起来

也很方便,但是放个控件,总觉得不如不用控件的爽。
3、InternetExplorer
调用ie来打开网页,与WebBrowser差不多。
4、INET控件
这是VB的一个控件,需要安装VB才有,与httpRequest擦不多。
5、httpRequest
这种方法功能最全,但是使用起来不太方便。

本题适合的方法为WebBrowser控件和httpRequest方法。
WebBrowser控件较简单。
httpRequest方法通过获取网页源文件,然后提取。要注意的是获取源文件的时候可能会出现乱码

,这时需要进行编码转换,将GB2312转为utf-8。提取源文件中的内容时,比较有效的方法时用正

则表达式来提取,正则表达式的功能十分强大,但是要灵活掌握还是要花点时间的。

参考答案:
关于WebBrowser控件的方法,这里就不给了(偷下懒:)),只给出一个提取部分列的小例子,可

以参考ldy888的答案,修改一下将会很不错,WebBrowser控件方法的速度很快,httpRequest要转

换编码,较废时间。

WebBrowser控件示例:
Sub web_data()
    Application.ScreenUpdating = False
    Me.WebBrowser1.Navigate "http://cn.finance.yahoo.com/q/hp?s=601988.SS&c=2006&a=06&b=5&f=2007&d=06&e=19&g=d"
    on error resume next
    Dim oDoc As Object
    Dim sDoc As Object
    Dim iText As String
    Set oDoc = Me.WebBrowser1.Document
    Set sDoc = Me.WebBrowser1.Document
    For DocElemsCnt = 0 To oDoc.all.Length - 1
        If oDoc.all.Item(DocElemsCnt).tagName = "TABLE" Then
            Set sDoc = oDoc.all.Item(DocElemsCnt)
            'MsgBox sDoc.innertext
            If Left(sDoc.innertext, 2) = "日期" And sDoc.Rows.Length > 1 Then
                    rCol = 0
                    For Rwlen = 0 To sDoc.Rows.Length - 2
                        rCol = rCol + 1
                            iText = sDoc.Rows(Rwlen).Cells(0).innertext
                            Cells(Rwlen + 1, 1).Value = iText
                            iText = sDoc.Rows(Rwlen).Cells(4).innertext
                            Cells(Rwlen + 1, 2).Value = iText
                    Next Rwlen
            End If
        End If
    Next DocElemsCnt
    Set oDoc = Nothing
    Set sDoc = Nothing
    MsgBox "数据更新完毕!"
    Application.ScreenUpdating = True
End Sub

这里只提供httpRequest+正则表达式方法的答案,供参考。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?免费注册

x

评分

参与人数 1鲜花 +2 收起 理由
高调的鳄鱼 + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

发表于 2007-8-28 10:47 | 显示全部楼层

已经把版主的示范文件收藏了。

想找一个比WebBrowser控件更快一些的方法

原以为WebBrowser控件有页面刷新会影响速度,不用控件的方法会快一些。

看了范例 发现httpRequest还要慢一些。

版主有没有更好的方法,或控件,请给个范例或指个方向,谢谢

TA的精华主题

TA的得分主题

发表于 2007-8-28 11:01 | 显示全部楼层

谢谢版主,已收藏,

因为WebBrowser控件简单灵活,所以一直用来提取网页数据。

原以为WebBrowser有页面刷新,会影响速度。 一直想找一个比WebBrowser控件更快的方法。

对网页方面的知识还相当匮乏。花了不少时间精力就是找不到。

看了httpRequest范例 觉得速度上不尽人意。

版主能不能 释疑 

1. 就速度而言 WebBrowser控件提取网页数据是不是最快。

2. 有没有更快的方法或控件

谢谢

QUOTE:
以下是引用agstick在2007-8-28 23:46:55的发言:
用httpRequest返回内容还是很快的,返回源文件,还要转换编码就要花时间了。对一些大的网页转换会很慢,因为是一个字节,一个字节的转。WebBrowser控件要比IE快一些。

谢谢,有您这句话,我暂时就不用费力找其他的方法了。

[此贴子已经被作者于2007-8-30 14:27:20编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-8-28 23:46 | 显示全部楼层
用httpRequest返回内容还是很快的,返回源文件,还要转换编码就要花时间了。对一些大的网页转换会很慢,因为是一个字节,一个字节的转。WebBrowser控件要比IE快一些。

TA的精华主题

TA的得分主题

发表于 2007-9-9 22:21 | 显示全部楼层

我是新学的,有个问题 如果提取的网页不是 直接输入的 而是在  比如SHEET2中 A1  单元格  中

那该怎么写啊

也就是说

A1  是一个连接 

A2  是另外一个数据连接

TA的精华主题

TA的得分主题

发表于 2007-9-9 22:29 | 显示全部楼层

我是 新手  想请教个问题 

文中所说的链接 都是直接输入进去的,那如果连接是比如 SHEET2中A2中的内容

那又该如何 写啊 ?

就是 A1 A2。。中 分别是不同的链接。

谢谢了

Range("a1").Hyperlinks(1).Address        可获取A1单元格中超链接的地址 --agstick

[此贴子已经被agstick于2007-9-17 9:46:30编辑过]

TA的精华主题

TA的得分主题

发表于 2007-12-28 13:34 | 显示全部楼层
我是新手,看到excel有如此功能,更看到有如此的高人在场,心里赞叹不已啊!这世上高手真多啊!!!!!!!

TA的精华主题

TA的得分主题

发表于 2008-4-20 17:05 | 显示全部楼层
受教了!!!最近总头疼网页数据抓取的事!   这里真是高手如云啊[em01][em10]

TA的精华主题

TA的得分主题

发表于 2008-5-16 11:12 | 显示全部楼层

     For DocElemsCnt = 0 To oDoc.all.Length - 1
        If oDoc.all.Item(DocElemsCnt).tagName = "TABLE" Then
            Set sDoc = oDoc.all.Item(DocElemsCnt)

枚举出网页中所有表格还用这么麻烦吗?用
for each sDoc in oDoc.all.tags("table")

for i=0 to oDoc.all.tags("table").length-1
即可

TA的精华主题

TA的得分主题

发表于 2008-8-14 09:42 | 显示全部楼层
请问如何将Excel表格连同嵌入的WebBrowser控件一起打印呀?我试了半天都不行.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,高效办公专列,每天发车

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2019-1-22 10:25 , Processed in 0.093926 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表