本期考察的时网页数据的提取,从参赛答案来看,有不少是通过下载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+正则表达式方法的答案,供参考。
|