Не удается получить (скрытые?) Свойства из веб-HTML при анализе с помощью VBA Excel - PullRequest
0 голосов
/ 25 мая 2018

Я хочу получить короткие строковые данные с веб-страницы, которые хотя и видны, но не могут быть выделены или скопированы с помощью курсора.При проверке кода я обнаружил, что нужная информация находится под свойством «value» элемента id, скопированного ниже «txtMaturity».Но при попытке получить «атрибут» с помощью VBA в Excel он получается пустым («»).

В качестве проверки, с той же процедурой, но с просто вызовом "innertext" (или нескольких других, которые я пробовал) в других частях страницы, результат в порядке, как и ожидалось ("txtMaturity"), поэтому считаю, что это не проблемакода VBA.

Есть ли другой способ вызова информации в свойствах кода?Очевидно, есть ограничение или скрытое свойство, которое ограничивает взаимодействие на живой странице.Учитывая, что я вижу информацию в коде, нужно сделать какой-то вызов.

Структура HTML:

<html  xmlns= ”http://www.w3.org/1999/html” class>
 <body data-spy=”scroll” data-target=”#nav-wrapper”>
  <div class=”foo” >
   <div class=”foo2”>

    <input id="txtMaturity" class="form-control input-sm" type="text" readonly="true"> 

   </div>
  </div>
 </body>
</html>

Процедура VBA (пожалуйста, не возражайте, если вложение избыточно, просто прокси реальногокод)

Sub getWeb()

Dim xhr As New MSXML2.XMLHTTP
Dim doc As New MSHTML.HTMLDocument
Dim table As HTMLHtmlElement

Set xhr = CreateObject("MSXML2.XMLHTTP") 

    With xhr
        .Open "GET", url
        .send

        While .readyState <> 4: DoEvents: Wend
            doc.body.innerHTML = .responseText
    End With

    Set table = doc.getElementsByClassName("foo")(0).children(0)

     output = table.getElementsByClassName("form-control input-sm")(0).getAttribute("value")

End sub

вывод: ""

Веб: http://www.mae.com.ar/legales/emisiones/ONDetalle.aspx?id=1415

Заранее спасибо

1 Ответ

0 голосов
/ 27 мая 2018

Ключ заключается в полной загрузке страницы перед попыткой извлечь информацию, так как эти значения заполняются функцией javascript при загрузке страницы, как я полагаю.Ваш текущий метод пытается получить значения, которые еще не были заполнены.


С Selenium:

Это должно работать с использованием selenium basic .Опасность, связанная с нижеследующим, заключается в том, что загрузка страницы превышает ожидаемое для страницы время ожидания селена по умолчанию.

Public Sub test()

    Dim d As WebDriver
    Set d = New ChromeDriver

    With d
         .Start "Chrome"
         .Get "http://www.mae.com.ar/legales/emisiones/ONDetalle.aspx?id=1415"

         Debug.Print "Nombre: " & .FindElementById("txtNombre").Value
         Debug.Print "Emisores: " & .FindElementById("txtEmisores").Value
         Debug.Print "Descripcion: " & .FindElementById("txtDescripcion").Value
         Debug.Print "MonedaEmision: " & .FindElementById("txtMonedaEmision").Value
         Debug.Print "Fecha: " & .FindElementById("txtFecha").Value
         Debug.Print "Vencimiento: " & .FindElementById("txtVencimiento").Value
         Debug.Print "Estado: " & .FindElementById("txtEstado").Value

         Stop

         'Other stuff
        '.Quit
   End With

End Sub

С IE

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

Option Explicit

Public Sub GetInfo()
    Dim IE As New InternetExplorer
    Dim html As HTMLDocument

    With IE
        .Visible = True
        .navigate "http://www.mae.com.ar/legales/emisiones/ONDetalle.aspx?id=1415"

        While .Busy Or .readyState < 4: DoEvents: Wend
        '<== Probably want to add a timeout for next loop
        Do
            DoEvents
        Loop While .document.getElementById("txtNombre").Value = vbNullString

        Set html = .document

        With html
            Debug.Print "Nombre: " & .getElementById("txtNombre").Value
            Debug.Print "Emisores: " & .getElementById("txtEmisores").Value
            Debug.Print "Descripcion: " & .getElementById("txtDescripcion").Value
            Debug.Print "MonedaEmision: " & .getElementById("txtMonedaEmision").Value
            Debug.Print "Fecha: " & .getElementById("txtFecha").Value
            Debug.Print "Vencimiento: " & .getElementById("txtVencimiento").Value
            Debug.Print "Estado: " & .getElementById("txtEstado").Value
        End With

        Stop
        'Quit '<== Remember to quit application
    End With

End Sub

Вывод:

Output


Ссылки:

  1. Microsoft Internet Controls
  2. Библиотека объектов HTML
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...