ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 35362|回复: 62

希望狼版主教教我们读取网页数据方面的知识

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-10-18 10:52 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
狼版主,您好!

    论坛上许多朋友不揣浅陋,拿出自己在某一方面的知识与大家共享,发帖子,开讲座。

    您在读取网页数据方面超级强大,本人曾数次得到您的无私帮助。但本人水平有限,鱼和渔不能兼得。非常希望您能在论坛传授一些这方面的知识。

TA的精华主题

TA的得分主题

发表于 2009-10-18 11:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我收集的资料,供你参考
近期写了一段程序:从网上下载数据,写入数据库,查询、分析、打印。找了很多的资料,现作一回顾总结,本篇主要写网页数据下载与控制。(以下均为本人的一些心得,写的不对的,请各位师傅指正。希望本文能对和我一样菜的朋友有一些帮助。)

一、概述及感谢
二、Maxthon的使用
三、网页关键字(录入、按钮、数据)解读
四、POST、GET与NAME、VALUE
五、使用WebBrowser
六、使用IE
七、查询结果是新弹出窗口的控制
八、使用POST方法
九、使用EXCEL获取网页数据
十、例:利用webbrowser获得网页数据
附件一、XmlHttp对象用法示例与说明

一、概述及感谢
需要用到网页控制的方面,大致概括一下为:
1、程序中需要嵌入一个网页,例如:天气预报。
2、需要从网上下载数据,写入到本地数据库中。
特别需要感谢Winland对我的指导。


二、Maxthon的使用
无论哪方面的应用,首要的是找到网址(也许是废话)。
以Winland的天气预报为例,假如我的程序需要这样一个东西,我该如何下爪:
1、打开http://www.17u.cn
2、点击“天气预报”,打开:http://www.17u.cn/tianqi
3、查一个城市试试,此时结果找到了,但网址没变。
4、点击Maxthon的viewpage。
5、在“框架”中,发现一个“内嵌框架”,点击打开。发现原来天气预报的网址为:
http://www.17u.cn/WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c
6、下一步,在我们自己的程序中就可以使用这个网址,直接来查询了。
综上所述,通过Maxthon,我们可以很方便地找到我们所需要的真正的网址。
在viewpage中还有一个“表单”,里面很清楚地显示了Name,method,以及Action。我理解这个Action就是“结果网页”的网址的后半部分(不知对不对?)。
(在网页的表单里面Action是目标地址,就是处理这些递交内容的服务器端脚本。 如果Action为空的话,就是当前文件。)

三、网页关键字(录入、按钮、数据)解读
<% 和 %>        ASP脚本片断的开始和结束。在<%和%>标签之间的脚本代码,在主页传递给用户浏览器之前 会在服务器上执行。
<HTML> 和 </HTML>        <HTML>标示网页的开头,</HTML>标示网页的结束。
<BODY> 和 </BODY>        网页上的文本应该放置在这些标示之间
<TABLE> 和 </TABLE>        表格的开始和结束
<TABLE Border = “1”>        表格边框参数明确表格边框的宽度
<TH> 和 </TH>        放置表格标题于这些标示之间
<TR> 和 </TR>        标示<TR>在表格里开始一新行。表格中每行以</TR>标示结束。
<TD> 和 </TD>        使用这些标示来明确表格单元格。每个单元格以<TD>标示开始,以</TD>标示结束。表格单元格可以包含任何内容,包括另一个表格。
我们需要重点关注的就是:<TABLE> 和 </TABLE>,<TR> 和 </TR>以及<TD> 和 </TD>。
文本框:<INPUT TYPE="text" NAME="Amount" VALUE="1" SIZE=10>,有的省略了TYPE,VALUE及SIZE,但应该是有关键字INPUT及NAME。
选择框:<SELECT NAME="From" SIZE=5 onChange="CheckMore()">
<OPTION VALUE="EUR" SELECTED>EUR Euro</OPTION>             ‘当前值
<OPTION VALUE="USD">USD United States Dollars</OPTION>
<OPTION VALUE="CAD">CAD Canada Dollars</OPTION>

</SELECT><BR>
单选钮:<INPUT type=radio CHECKED value=1 name=order>升序       ‘当前选择
<INPUT type=radio value=2 name=order>降序
按健:<INPUT language=javascript onclick="return onclick1()" type=submit value=查询 name=fetchevent>
(winland注解:这个地方建议写的详细一点,先介绍一下简单的HTML文档格式,再说说Document Object Model,这个对下面的内容更有帮助。)(查了一下关于DOM的内容,大致看了一下,好像很复杂,也没有一个介绍的比较系统的,所以,暂时写不出来。)


四、POST、GET与NAME、VALUE
为了从网页获取数据,需要明确参数。要在网络查询里,向网络服务器发送参数的话,那么需要在核实某个具体网络服务器使用哪种方法后,使用POST或者GET方法。
打开源码,查找“POST”,如果给网络服务器发送参数使用的是POST方法,那么文本POST就应该出现。如果网络服务器使用GET方法接收参数的话,那么可以在浏览器地址栏里看到该参数名称和值。例如:
http://www.nycenet.edu/dist_sch/ ... /asp?boro=Manhattan &flag= schoolInfo2
(第一个参数前面带有一个问号,参数之间使用&符号分割开来,参数的先后排列顺序不重要)
查找“Name”,在单词name之后,可以看到括号里有一些文本, 这些文本就是第一个参数的名称。在单词“value=”后面,是参数的当前值。例如:
<INPUT TYPE="text" NAME="Amount" VALUE="1" SIZE=10><BR>
在上面的HTML语句中,单词“Amount”是参数名称,“1”是该参数的当前值。参数值也可以是HTML<option>标签中的 选项之一。例如:
<SELECT NAME="From" SIZE=5 onChange="CheckMore()">
<OPTION VALUE="EUR" SELECTED>EUR Euro</OPTION>             ‘当前值
<OPTION VALUE="USD">USD United States Dollars</OPTION>
<OPTION VALUE="CAD">CAD Canada Dollars</OPTION>
<OPTION VALUE="GBP">GBP United Kingdom Pounds</OPTION>
<OPTION VALUE="DEM">DEM Germany Deutsche Marks</OPTION>

</SELECT><BR>

Post与Get的区别:
1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。
4、Get传输的数据量小,这主要是因为受URL长度限制,只能传递大约1024字节;而Post可以传输大量的数据,可以达到2M,所以在上传文件只能使用Post。
5、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
6、Get是Form的默认方法。


五、使用WebBrowser
使用WebBrowser需要添加“Microsoft Web 浏览器”(VBA)或“Microsoft internet controls”(VB)。
1、WebBrowser的简要使用方法:
‘打开前
Urlstr="http://www.17u.cn/WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c"
F_tqyb.WebBrowser1.Navigate Urlstr
F_tqyb.Show      ‘这句话屏蔽时,WebBrowser同样打开网页,不过不显示在桌面上

Private Sub WebBrowser1_StatusTextChange(ByVal Text As String)
    If WebBrowser1.ReadyState <> READYSTATE_COMPLETE Then Exit Sub ‘页面调用是否完毕
    ……
End Sub

2、我们想要的网页内容:
一般说来,我们想要的网页内容,就在WebBrowser1.document.body.innerhtml和WebBrowser1.document.body.innertext中,通过替换、分析,得到我们想要的数据。
Innerhtml中的内容就是网页源码。
innertext中的内容则是网页上所显示的内容。(这个内容就是我们把网页另存为文本时的内容)
个人认为使用Innerhtml要方便一些。

3、在程序中使用WebBrowser显示网页
⑴、如果你所需要的网页网址中带有?,且取值规则非常清楚,则很方便,直接将参数及值写到网址中就好,如上例所示(显示宜昌的天气),只需注意:第一个参数前面带有一个问号,参数之间使用&符号分割开来,参数的先后排列顺序不重要。
如果值中带有非英文和数字,则需进行转换。(套用Winland的程序)
例:City= Escape(“宜昌”)
Public Function Escape(ByVal strText As String) As String
    Dim JS As ScriptControl
    Set JS = New MSScriptControl.ScriptControl
    JS.Language = "JavaScript"
    Escape = JS.Eval("encodeURI('" & Replace(strText, "'", "\'") & "');")
End Function

⑵、如果你所需要的网页网址中带有?,但取值规则不清楚,比如用一长串数值代替,则需要从上一级开始查起,我们估且称之为“查询网页”和“结果网页”。
通过分析“查询网页”使用程序自动输入、选择、点击,或用户使用时输入、选择、点击,打开“结果网页”。
但此时就存在一个问题:“结果网页”是在新窗口中打开的,并没有显示在WebBrowser1中!这时候,我们从下面的几种方法中找到一种适合于自己的:(具体见后)
①、“遍历已打开的IE窗口”,找到“结果网页”,读网址、关闭网页,使用EXCEL的“获取外部数据”将网页内容读到EXCEL中。
②、“遍历已打开的IE窗口”,找到“结果网页”的hwnd(句柄),置为当前,然后模拟鼠标点击一下,再sendkey:全选、复制、关闭网页,最后在EXCEL中粘贴。
③、“遍历已打开的IE窗口”,找到“结果网页”,恢复对IE的控制,读innerhtml,分析innerhtml。
④、强制新窗口也在WebBrowser1中显示,不另开IE或Maxthon,读innerhtml,分析innerhtml。
⑤、使用POST方法(winland提供)。
⑥、使用EXCEL的POST方法。

⑶、如果你所需要的网页网址中没有?,无论你的查询条件是什么,“结果网页”的网址都不变,此时,如果直接在IE中输入该地址,则什么也得不到。对于这类网页也只能从上一级开始查起,同上。
(我刚完成的这个程序就属于这类,使用winland提供的POST方法都不行,最后使用EXCEL的POST方法完成)


六、使用IE
1、如果不想使用WebBrowser,而想使用Internet Explorer,或者“结果网页”是新窗口而“被迫”使用,控制起来也还比较方便。
Dim IEPL As Object
Set IEPL = CreateObject("InternetExplorer.Application")
IEPL.Visible = False        ‘隐藏
‘打开网页
URLstr=”http://www.XXX.XXX
IEPL.Navigate URLstr
‘与webbrowser一样,当页面调用完毕时,发生DocumentComplete事件。
‘读Innerhtml
……
IEPL.Quit                   ‘关闭
或:
Shell ("C:\Program Files\Internet Explorer\IEXPLORE.exe about:blank")
遍历已打开的IE窗口,通过窗口标题找到刚才打开的IE(或“结果网页”新窗口),恢复对IE的控制。
‘遍历已打开的IE窗口
    Dim dWinFolder As New ShellWindows
    Dim objIE As Object
    Dim Czpmxurl As String, Czpmxname As String   
   
    For Each objIE In dWinFolder
        Czpmxname = objIE.LocationName            ‘标题
        If InStr(Czpmxname, "查询结果") Then
            Zdurl = True
        End If
    Next
    If Zdurl then         ‘找到了
    objIE.application.Visible = False        ‘隐藏
Czpmxurl = objIE.LocationURL          ‘网址
‘读Innerhtml
        ……
    end if
objIE.application.Quit                   ‘关闭

2、如果“结果网页”新窗口不是IE,而是Maxthon,则要麻烦一些,上面提到的隐藏和关闭方法对Maxthon分别无效和出错,其它控制方法倒是一样。此时要关闭Maxthon,则要使用sendkey Alt+F4的方法了。
当然,也可以通过修改注册表,将IE设置为默认。


七、查询结果是新弹出窗口的控制
        当查询结果是新弹出窗口,前面已谈到IE控制,下面再谈两种方法:
1、例:通过窗口标题,找到“结果网页”的hwnd(句柄),置为当前,然后模拟鼠标点击一下,再sendkey:全选、复制、关闭网页,最后在EXCEL中粘贴。
‘定义API函数
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Type POINTAPI
    x As Long
    y As Long
End Type

Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Public Const SM_CXSCREEN = 0
Public Const SM_CYSCREEN = 1

Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_MOVE = &H1 '  mouse move
Public Const MOUSEEVENTF_LEFTDOWN = &H2 '  left button down
Public Const MOUSEEVENTF_LEFTUP = &H4 '  left button up
Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '  right button down
Public Const MOUSEEVENTF_RIGHTUP = &H10 '  right button up
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '  middle button down
Public Const MOUSEEVENTF_MIDDLEUP = &H40 '  middle button up
Public Const MOUSEEVENTF_ABSOLUTE = &H8000 '  absolute move

‘定义
Dim Czpmxhwnd As Long

Czpmxhwnd = FindWindow(vbNullString, "http://www.XX.XX - 查询结果 - Microsoft Internet Explorer")       ‘根据窗口标题查找,找到后返回句柄
If Czpmxhwnd = 0 Then Czpmxhwnd = FindWindow(vbNullString, "查询结果 - Microsoft Internet Explorer")
    If Czpmxhwnd = 0 Then
            MsgBox "未找到", vbOKOnly, "提示"
            Exit Sub
    End If
    aa = SetForegroundWindow(Czpmxhwnd)    ‘将网页调到前台
    Sleep 100
   mouse_event MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, 0&, 0&, 0, 0  ‘模拟鼠标点击,设置焦点
    Sleep 100
    SendKeys "^a", True      ‘Ctrl+A全选
    Sleep 100
    SendKeys "^c", True       ‘Ctrl+C复制
    Sleep 100
    SendKeys "%{F4}", True     ‘Alt+F4关闭

‘打开EXCEL,粘贴
……

2、强制新窗口也在WebBrowser1中显示,不另开IE或Maxthon
使用该方法,不管是通过程序“自动点击”“提交”按钮,还是用户点击“提交”按钮,都强制新窗口也在WebBrowser1中显示,不另开IE或Maxthon。
新建窗口from1,窗口中放置一个WebBrowser1。
Private Sub Form_Load()
        Dim Strurl as string
        Strurl="……"          ‘网址
    WebBrowser1.Navigate strurl
End Sub

Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
        ‘当有新弹出窗口时触发
    Dim NewWindow As Form1
    Set NewWindow = New Form1
    NewWindow.Show
    Set ppDisp = NewWindow.WebBrowser1.Object
        ‘VBA中以上命令出错,需改为:
        ‘Set ppDisp = NewWindow.WebBrowser1
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
‘网页”下载完毕”时触发
    Dim I As Single, J As Single
    If WebBrowser1.ReadyState <> READYSTATE_COMPLETE Then Exit Sub      ‘网页全部打开
    ‘根据窗口标题或其它属性判断完成的是“查询网页”还是“结果网页”
        ‘根据不同的要求,写相应的命令
……
End Sub


八、使用POST方法(winland提供)
使用这个方法,首先得根据“查询网页”中的内容,编写要提交的查询字串。当然,如果有非英文和数字,还必须利用上面的Escape函数进行转换。
strQuery="year_start=%202007&month_start=%205&date_start=%2012&" & _
"hour_start=%200" & _
"&year_end=%202007&month_end=%205&date_end=%2013&hour_end=%200" & _
"&substation%5B%5D=00&R1=sortall&order=1&desckey="

‘以上这句话的意思是起始年月日时为:2007-5-12 0时(%20为空格),终止时间:2007-5-13 0时,单位为00(%5B%5D为[]),全部内容,升序,关键字无。
‘这里面没有“提交”按钮的内容

Call QueryStr(strQuery)

Public Sub QueryStr(strQuery As String)
Dim httpRequest As MSXML2.XMLHTTP30
Dim txtContent As String
Dim strBuffer As String
Dim lngBufferSize As Long
Dim lngResult As Long
Dim arrByte() As Byte
Dim lSize As Long
Dim l As Long

Set httpRequest = New MSXML2.XMLHTTP30
httpRequest.Open "POST", "http://10.228.98.9/eventresult.php", False
httpRequest.setRequestHeader "Content-Type", "text/html"
httpRequest.send strQuery
If httpRequest.Status = 200 Then
    ReDim arrByte(UBound(httpRequest.responseBody)) As Byte
    For l = 0 To UBound(httpRequest.responseBody)
        arrByte(l) = httpRequest.responseBody(l)
    Next l
    lngBufferSize = (UBound(arrByte) + 1) * 2
    strBuffer = String$(lngBufferSize, vbNullChar)
    lngResult = MultiByteToWideChar(936, 0, arrByte(0), lngBufferSize / 2, StrPtr(strBuffer), lngBufferSize)
    txtContent = Left(strBuffer, lngResult)
    MsgBox txtContent
Else
    reportErr (httpRequest.Status)
End If
httpRequest.abort
Set httpRequest = Nothing
End Sub

Sub reportErr(lStatus As Integer)
        Select Case lStatus
            Case 400
                MsgBox "Bad Request", vbCritical, "连接错误"
            Case 401
                MsgBox "Unauthorized", vbCritical, "连接错误"
            Case 402
                MsgBox "Payment Required", vbCritical, "连接错误"
            Case 403
                MsgBox "Forbidden", vbCritical, "连接错误"
            Case 404
                MsgBox "Not Found", vbCritical, "连接错误"
            Case 407
              MsgBox "Proxy Authentication Required", vbCritical, "连接错误"
            Case 408
                MsgBox "Request Timeout", vbCritical, "连接错误"
            Case 503
                MsgBox "Service Unavailable", vbCritical, "连接错误"
            Case Else
              MsgBox "Can not reach by other reason", vbCritical, "连接错误"
        End Select
End Sub

TA的精华主题

TA的得分主题

发表于 2009-10-18 12:00 | 显示全部楼层
九、使用EXCEL获取网页数据
1、获取有明确网址的网页数据
通过上面种种办法找到网址后,
‘这是以前做的一个网页数据查询
‘打开EXCEL
……
    Weburl = "URL;http://XXX.XX.XX……"
    With ActiveSheet.QueryTables.Add(Connection:=Weburl, & _
Destination:=Range("A1"))
        .Name = "caozuopiao"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlAllTables
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .Refresh BackgroundQuery:=False
    End With
‘数据已写入到EXCEL
……

2、获取“结果网页”网址都一样的网页数据
(本人最近完成的程序就是这样,最终也是靠这个方法完成,使用winland的POST方法也不行,不知道具体原因。)
    weburl = "URL;http://10.228.98.9/eventresult.php"
Strpost ="year_start=%202007&month_start=%205&date_start=%2012&" & _
"hour_start=%200" & _
"&year_end=%202007&month_end=%205&date_end=%2013&hour_end=%200" & _
"&substation%5B%5D=00&R1=sortall&order=1&desckey="

    With Exsheet.QueryTables.Add(Connection:=weburl, & _
Destination:=Exsheet.Range("a1"))
        .PostText = Strpost         ‘post字串
        .BackgroundQuery = True
        .WebSelectionType = xlSpecifiedTables
        .WebTables = "1"       '导入网页中的第一个表,也只有一个表格,网页上可能会包含很多个表格,表格让你组织网页内容。当在记事本里查看HTML源代码时,你会发现通过下述标签你很容易识别这些表格:<TABLE>(表格开始)和</TABLE>(表格结束)
        .WebFormatting = xlWebFormattingAll
        .RefreshStyle = xlOverwriteCells
        .AdjustColumnWidth = True
        On Error GoTo Wlcw
        .Refresh BackgroundQuery:=False      ‘发送命令?
        On Error GoTo 0
        .SaveData = True
    End With
‘数据已写入到EXCEL
……

Wlcw:     '网络不通
    If P_cxzlly = "sccx" Or P_cxzlly = "qmcx" Then
        aa = MsgBox("网络不通,请手动打开网络http://10.228.98.9/试试!", vbOKOnly, "提示")
    End If
    Exit Sub


十、例:利用webbrowser获得网页数据
以xuzong求助为例:
http://club.excelhome.net/dispbb ... replyID=&skin=0
下面的方法很笨,但个人觉得思路很清晰。
1、打开网页:http://www.htky365.com/express.asp
2、查看源文件,输入POST查找到:输入框和确定按钮的Name。
    <form action="track_result.asp" method="post" name="form1" id="form1" >
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td width="3%">&nbsp;</td>
            <td width="91%" align="center"><textarea name="ID" cols="20" rows="10" class="arial" id="ID"></textarea>            </td>
            <td width="6%">&nbsp;</td>
          </tr>
          <tr>
        <td>&nbsp;</td>
        <td align="center"><input name="Submit" type="submit" class="butCopy" value=" 确 定 ">
             <input name="Submit2" type="reset" class="butCopy" value=" 取 消 ">
3、在sheet1中加一个“下载数据”的按钮,VBA中加一个窗体Web,放置一个Webbrowser。
4、“下载数据”的按钮程序如下:
Private Sub CommandButton1_Click()
    web.WebBrowser1.Navigate "http://www.htky365.com/express.asp"
    'web.Show       '设计时需要,实际运行时删除
End Sub
5、Web窗体程序如下:
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
'页面调用完毕
    If WebBrowser1.ReadyState <> READYSTATE_COMPLETE Then Exit Sub       '页面是否调用完毕
    If pDisp.LocationURL = "http://www.htky365.com/express.asp" Then     '查询网页已打开
        Xrsj
    End If
    If pDisp.LocationURL = "http://www.htky365.com/track_result.asp" Then   '结果网页已打开
        Dqsj
    End If
End Sub

Sub Xrsj()
'写入数据
    Dim I As Long, J As Single
    Dim Jlzs As Long          '记录总数
    Dim Strdh As String       '单号字串
    Dim Doc As Object

    '获得浏览器地文档对象
    Set Doc = WebBrowser1.Document
    Jlzs = Sheets(1).Cells(65536, 1).End(xlUp).Row - 1
    For I = 2 To Jlzs + 1
        Strdh = Strdh & Sheets(1).Cells(I, 1) & vbCrLf
    Next I
    '填写用户名字段,点击确定按钮
'doc.body.All("ID").Value = Strdh
'doc.body.All("Submit").Submit
'本来准备直接通过Name来赋值的,“点击”“确定”按钮的,但不知为什么提示:不支持该属性。没办法,只好使用下面的笨办法,通过name找到item号,再对相应的item赋值。
'究竟错在哪?请winland指点。
    'On Error Resume Next
    'For I = 0 To Doc.body.All.Length - 1
        'Strdh = Strdh & "      " & I & "  " & Doc.body.All.Item(I).Name
    'Next I
    'On Error GoTo 0
    'aa = MsgBox(Strdh, vbOKOnly, "")
    Doc.body.All.Item(102).Value = Strdh         'ID
    Doc.body.All.Item(107).Click                 'submit
End Sub

Sub Dqsj()
'读取数据
    Dim Strhtml As String, Strtext As String
    Dim I As Long, J As Integer
    Dim Doc As Object
   
Set Doc = WebBrowser1.Document
' innerhtml和innertext到底哪个好用一些,就看自己的了
    Strhtml = Doc.body.innerhtml
    'Strtext = Doc.body.innertext
    Strhtml = Right(Strhtml, Len(Strhtml) - InStr(Strhtml, "运单编号"))      '通过网页上的提示找到最近的表格
    Strhtml = Right(Strhtml, Len(Strhtml) - InStr(Strhtml, "<TABLE") + 1)    '通过关键字提取表格-表头
    Strhtml = Left(Strhtml, InStr(Strhtml, "</TABLE") + 7)                   '通过关键字提取表格-表尾
   
    Sheets(2).Cells(1, 2) = Strhtml
    'Sheets(2).Cells(2, 2) = Strtext
'表格提取出来后,再就根据<TR>和</TR>,<TD> 和 </TD>这些关键字来提取表格中的内容了,略
……
End Sub




附件一、XmlHttp对象用法示例与说明
XmlHttp对象用法示例与说明:
asp(VBScript)应用示例
Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
xmlhttp.Open "GET", url , False, "", "" '异步请求
xmlhttp.setRequestHeader "USER-AGENT", "test" '指定用户代理
xmlhttp.Send
GetPage = xmlhttp.ResponseBody '返回内容,字节数组,如果为GB2312还需要解码
’下边代码将上述结果还原为GB2312编码的字符串
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write GetPage '这里写入刚才返回的字节数组
objstream.Position = 0
objstream.Type = 2
objstream.Charset = "GB2312"
BytesToBstr = objstream.ReadText

下面介绍具体的属性和方法
属性:
1、onreadystatechange
指定当readyState属性改变时的事件处理句柄。只写。
2、readyState
返回当前请求的状态,只读。
0 对象已建立,但是尚未初始化,没有调用open
1 对象已建立,未调用send
2 send方法已调用,当前状态和http头未知
3 已接收部分数据,获取数据会出现错误
4 数据接收完毕,此时可以获取完整的回应数据
3、responseBody
将回应信息正文以unsigned byte数组形式返回。只读。
4、responseStream
以Ado Stream对象的形式返回响应信息。只读。
5、responseText
将响应信息作为字符串返回。只读。
XMLHTTP尝试将响应信息解码为Unicode字符串,XMLHTTP默认将响应数据的编码定为UTF-8,如果服务器返回的数据带BOM(byte-order mark),XMLHTTP可以解码任何UCS-2 (big or little endian)或者UCS-4 数据。注意,如果服务器返回的是xml文档,此属性并不处理xml文档中的编码声明。最好使用responseXML来处理。
6、responseXML
将响应信息格式化为Xml Document对象并返回。只读。
将响应信息格式化为Xml Document对象并返回。如果响应数据不是有效的XML文档,此属性本身不返回XMLDOMParseError,可以通过处理过的DOMDocument对象获取错误信息。eg: xmlhttp.responseXML.xml 将返回xml文档的字符串内容。
7、status
返回当前请求的http状态码。只读。
数值 描述
100 Continue
101 Switching protocols
200 OK
201 Created
202 Accepted
203 Non-Authoritative Information
204 No Content
205 Reset Content
206 Partial Content
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
307 Temporary Redirect
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Request Entity Too Large
414 Request-URI Too Long
415 Unsupported Media Type
416 Requested Range Not Suitable
417 Expectation Failed
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported

8、statusText
返回当前请求的响应行状态。只读。
方法:
1、abort
取消当前请求
2、getAllResponseHeaders
获取响应的所有http头
每个http头名称和值用冒号分割,并以\r\n结束。当send方法完成后才可调用该方法。
3、getResponseHeader
从响应信息中获取指定的http头
4、open
创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码)
语法:xmlhttp.open(bstrMethod, bstrUrl, [varAsync], [bstrUser], [bstrPassword]);
参数说明:
bstrMethod
http方法,例如:POST、GET、PUT及PROPFIND。大小写不敏感。
bstrUrl
请求的URL地址,可以为绝对地址也可以为相对地址。
varAsync[可选]
布尔型,指定此请求是否为异步方式,默认为true。如果为真,当状态改变时会调用onreadystatechange属性指定的回调函数。
bstrUser[可选]
如果服务器需要验证,此处指定用户名,如果未指定,当服务器需要验证时,会弹出验证窗口。
bstrPassword[可选]
验证信息中的密码部分,如果用户名为空,则此值将被忽略。
5、send
发送请求到http服务器并接收回应
此方法的同步或异步方式取决于open方法中的bAsync参数,如果bAsync = False,此方法将会等待请求完成或者超时时才会返回,如果bAsync = True,此方法将立即返回。默认编码为utf-8。如果返回结果为xml,则自动应用该xml文档的编码属性。
6、setRequestHeader
单独指定请求的某个http头
用法:xmlhttp.setRequestHeader(bstrHeader, bstrValue);

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-10-18 16:53 | 显示全部楼层
多谢,但“二、Maxthon的使用”部分举的例子已经过时了。

TA的精华主题

TA的得分主题

发表于 2009-10-18 21:27 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-10-18 23:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-10-19 08:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 yyyplay1 于 2009-10-18 23:26 发表
例子都过时了,打不开相关的网页,没法学。

学习的不是例子,学习的是方法。

TA的精华主题

TA的得分主题

发表于 2009-10-19 08:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
报个到,这方面的内容很有用,回来内容多了再好好研究!

TA的精华主题

TA的得分主题

发表于 2009-10-19 10:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢楼主分享!辛苦了。

TA的精华主题

TA的得分主题

发表于 2009-10-19 15:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

responseXML该如何用

原帖由 qtqtqt 于 2009-10-18 12:00 发表
……
6、responseXML
将响应信息格式化为Xml Document对象并返回。只读。
将响应信息格式化为Xml Document对象并返回。如果响应数据不是有效的XML文档,此属性本身不返回XMLDOMParseError,可以通过处理过的DOMDocument对象获取错误信息。eg: xmlhttp.responseXML.xml 将返回xml文档的字符串内容……


请问狼+winland版:
responseXML,该如何用?能取节点吗?能否给个例子学习,比如结合getelementsbytagname的。
期待版主及各方高手解答。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 15:57 , Processed in 0.050313 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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