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