Получите HTML-данные из родительского окна Url без браузера IE - информация об отслеживании UPS для нескольких пакетов

0

Надеюсь, это не глупый вопрос. У меня есть поиск с высоким и низким для ответа, теперь это удача. Я новичок в использовании VBA для получения информации из Интернета. У меня рабочая версия, которая использует IE.doc, но она медленная, и вам приходится ждать загрузки браузеров. Я привел ниже рабочую функцию, которую я преобразовал в подпрограмму для примера. Проблема в том, что без открытия родительского окна у вас нет доступа ко всем номерам отслеживания.

Это JavaScript, который я использую для вызова родительского окна с Internet Explore. Возможно ли это сделать? Я иду в правильном направлении?

IE.document.parentWindow.execScript "handleTrackDetailShowShipments()", "JavaScript"

Я впервые использовал "С CreateObject (" msxml2.xmlhttp ")", так что, возможно, я просто задаю вопрос неправильно при поиске ответа.

Ссылки: регулярные выражения Microsoft VBScript 5.5

VBA:

Sub GetTrackingData_Html_UPS()

    Dim TrackN As String
    Dim x As Long, y As Long
    Dim Htm As Object
    Dim i As Integer
    Dim theRegex As Object
    Dim theString As String
    Dim s() As String
    Dim myColl As Collection
    Dim iCtr As Long
    Dim tempArray As Variant

    Set myColl = New Collection
    Set theRegex = CreateObject("VBScript.RegExp")

    With theRegex
        .MultiLine = False
        .Global = True
        .IgnoreCase = False
    End With

    Set Htm = CreateObject("htmlFile")

    TrackN = "1Z7452780345800256"

    With CreateObject("msxml2.xmlhttp")
        .Open "GET", "http://wwwapps.ups.com/WebTracking/processRequest?HTMLVersion=" & _
                     "5.0&Requester=NES&AgreeToTermsAndConditions=yes&loc=en_US&tracknum=" _
                    & TrackN & "&WT.z_eCTAid=ct1_eml_Tracking", False
         .send
        Htm.body.innerHTML = .responseText
    End With

    'IE.document.parentWindow.execScript "handleTrackDetailShowShipments()", "JavaScript" '< I want data from the parent window
    '/\ this works if i use InternetExplorer but it is so slow and hit or miss

    Debug.Print Htm.getElementsByTagName("h1")(0).innerText & vbNewLine & _
                Htm.getElementsByTagName("h4")(1).innerText & vbNewLine & _
                Htm.getElementsByTagName("h4")(4).innerText & vbNewLine & _
                "Master Tracking Number:  " & Htm.getElementsByTagName("h3")(0).innerText & _
                vbNewLine

    theRegex.Pattern = "([0-9][A-z][0-9A-z][0-9][0-9][0-9][0-9][0-9A-z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])"

    Set MyMatches = theRegex.Execute(Htm.body.innerHTML)

        If MyMatches.Count <> 0 Then
                With MyMatches
                    For myMatchCt = 0 To .Count - 1
                        For subMtCt = 0 To .Item(subMtCt).SubMatches.Count - 1
                            Item = (.Item(myMatchCt).SubMatches.Item(subMtCt))
                            Tracking = Tracking & Trim(Item) & ","
                        Next
                    Next
                End With
            Else
        End If

        s = Split(Tracking, ",")

        On Error Resume Next

        For i = UBound(s) - 1 To 0 Step -1
              myColl.Add s(i), CStr(s(i))
        Next i

        On Error Resume Next

        ReDim s(LBound(s) To LBound(s) + myColl.Count - 1)

        For i = 1 To myColl.Count
           Debug.Print i & " " & myColl(i)
        Next i

    Set theRegex = Nothing
    Set Htm = Nothing
    Set MyMatches = Nothing

End Sub
Теги:
excel-vba

1 ответ

0
Лучший ответ

Вы можете загрузить данные со страницы и использовать регулярное выражение, чтобы найти то, что вы хотите на нем, и загрузить в переменную.

Попробуйте этот способ, используя xmlhttp. Отредактируйте URL-адрес и т.д. Если кажется, что нужно прокомментировать if/end, если сбрасывать информацию, даже если она работает. Это vbscript, но vbscript работает в vb6. Вы можете оптимизировать его, добавив его как ссылку и создав файл и явный объект xmlhttp - set file = new microsoft.xmlhttp

 On Error Resume Next
 Set File = WScript.CreateObject("Microsoft.XMLHTTP")
 File.Open "GET", "http://www.microsoft.com/en-au/default.aspx", False
 'This is IE 8 headers
 File.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET4.0C; .NET4.0E; BCD2000; BCD2000)"
 File.Send
 If err.number <> 0 then 
    line =""
    Line  = Line &  vbcrlf & "" 
    Line  = Line &  vbcrlf & "Error getting file" 
    Line  = Line &  vbcrlf & "==================" 
    Line  = Line &  vbcrlf & "" 
    Line  = Line &  vbcrlf & "Error " & err.number & "(0x" & hex(err.number) & ") " & err.description 
    Line  = Line &  vbcrlf & "Source " & err.source 
    Line  = Line &  vbcrlf & "" 
    Line  = Line &  vbcrlf & "HTTP Error " & File.Status & " " & File.StatusText
    Line  = Line &  vbcrlf &  File.getAllResponseHeaders
    wscript.echo Line
    Err.clear
    wscript.quit
 End If

On Error Goto 0

 Set BS = CreateObject("ADODB.Stream")
 BS.type = 1
 BS.open
 BS.Write File.ResponseBody
 BS.SaveToFile "c:\users\test.txt", 2

Также посмотрите, работают ли эти другие объекты.

C:\Users>reg query hkcr /f xmlhttp

HKEY_CLASSES_ROOT\Microsoft.XMLHTTP HKEY_CLASSES_ROOT\Microsoft.XMLHTTP.1.0 HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.3.0 HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.4.0 HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.5.0 HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.6.0 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.3.0 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.4.0 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.5.0 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.6.0 Конец поиска: найдено 12 совпадений.

Также имейте в виду, что существует ограничение на то, сколько раз вы можете вызвать какой-либо конкретный объект XMLHTTP до того, как произойдет локаут. Если это произойдет, и это происходит при отладке кода, просто измените его на другой объект xmlhttp

  • 0
    Я не уверен, что понимаю ваш пост. Мне просто нужно вызвать родительское окно. Как или я могу загрузить родительское окно? <form name = "detailForm" action = " wwwapps.ups.com/WebTracking/detail " method = "post">

Ещё вопросы

Сообщество Overcoder
Наверх
Меню