izluščiti podatek iz HTML tabele

Pomoč pri izdelavi makrov
Odgovori
Rolle
Prispevkov: 36
Pridružen: Sr Sep 23, 2009 1:28 pm

izluščiti podatek iz HTML tabele

Odgovor Napisal/-a Rolle »

Zdravo,
Na spodnji povezavi bi rad izluščil podatek o zadnji overitvi števca (znotraj elementa "td"). Ko v DOM preštevam vse tag-e za "td" mi jih najde 115. Zanima me zakaj mi jih funkcija prešteje precej manj in podatka o zadnji overitvi (za spodnji primer 30.9.15) sploh ne najde? Hvala za odg. in lep pozdrav.

Koda: Izberi vse


Sub test()
Dim IE As Object
Dim doc As Object
Dim colTR As Object
Dim colTD As Object
Dim tr As Object
Dim td As Object
Set IE = CreateObject("InternetExplorer.Application")

IE.Visible = True

IE.Navigate "http://www.mirs-info.si/Verification/index.php?Action=CheckInstrument"

Do Until IE.ReadyState = 4: DoEvents: Loop

Set doc = IE.Document

SerialNumber = 20967644
 
 Set the_input_elements = doc.getElementsByTagName("input")
 
 For Each Input_element In the_input_elements
    If Input_element.getAttribute("name") = "FilterSerialNumber" Then
        Input_element.Value = SerialNumber
        Exit For
    End If
 Next Input_element
 
 Set the_input_elements = doc.getElementsByTagName("input")
 
 For Each Input_element In the_input_elements
    If Input_element.getAttribute("value") = "Išči" Then
        Input_element.Click
        Exit For
    End If
    
 Next Input_element


    Set colTD = doc.getElementsByTagName("TD")

        For Each td In colTD
        Count = Count + 1
        
            'If Count = 70 Then
            'output = td.innerText
            'List4.Range("D3").Value = output
            'Exit For
            'End If
            MsgBox td.innerText
          
        Next td

IE.Quit

End Sub


admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: izluščiti podatek iz HTML tabele

Odgovor Napisal/-a admin »

Pozravljeni,

Ne vem kako ste vi šteli TH elemente, vendar najpreprosteje je, da se najprej vprašate kaj sploh dobite oz. kaj vam IE sploh vrne. Zato si lahko v neko celico izpišete vsebino vrnjenega HTML-ja. Recimo:

Koda: Izberi vse

Range("B2") = doc.body.innerhtml
In tako lahko vidite, da vam bo IE vrnil pač originali HTML dokument, saj iskanje dinamično spremeni HTML dokument, vi pa obdelujete še vedno starega - nespremenjenega. Torej pred zanko še enkrat preberite vrnjeni HTML:

Koda: Izberi vse

....
    Set doc = IE.Document
    Set colTD = doc.body.getElementsByTagName("TD")
   
    count = 0
    For Each td In colTD
....
Vendar pa boste opazili, da tudi to ne pomaga.... Dokler se na tej vrstici malo ne ustavite!!! In s tem pridete tudi do rešitve.

Problem je namreč v tem, da se HTML na omenjeni strani dinamično spreminja in to asinhrono, kar pomeni da je vaša koda "prehitra" in IE nima časa, da bi vrnil popravljen HTML Potrebno je torej malo počakati, da lahko IE naloži nove podatke iz strežnika, torej nekaj takšnega:

Koda: Izberi vse

 ....
  Next Input_element  ' izvede iskanje

  Sleep 1000  ' čaka 1 sec
  Set doc = IE.Document  ' prebere nov dokument
  Set colTD = doc.body.getElementsByTagName("TD")

  count = 0
  For Each td In colTD
  ....
Da pa bi VBA poznal Win funkcijo Sleep, pa morate na nivoju modula zapisati še deklaracijo:

Koda: Izberi vse

#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
#End If
Pomembno
1. Čas pri funkciji Sleep je v milisekundah, torej 1000 pomeni 1 sekundo, 5000 pa pet sekund
2. Koliko časa morate čakati pa ne morete vedeti vnaprej. Odvisno je od spletne strani! Zato mogoče daste večji čas kot 1 sec .Lahko pa tud preverjete ali se je HTML spremenil in če se ni še čakate....
lp,
Matjaž Prtenjak
Administrator
Rolle
Prispevkov: 36
Pridružen: Sr Sep 23, 2009 1:28 pm

Re: izluščiti podatek iz HTML tabele

Odgovor Napisal/-a Rolle »

Hvala za nasvet in pomoč.

Zanimivo: ob upoštevanju vašega nasveta je zadeva najprej funkcionirala (sleep 5000), potem pa, ne vem zakaj, spet ne, kljub temu da sem sleep nastavil na 60.000. Je možno da se HTML obnavlja več kot 60s?
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: izluščiti podatek iz HTML tabele

Odgovor Napisal/-a admin »

:)

To nima zveze ne z IE ne z VBA. Glede na to, kaj počnete, sklepam da se te "spomnili" in izvajate povpraševanja po omenjeni spletni strani eno za drugim. In ker spletna strani ni namenjena takšnemu delu, vas po določenem času onemogoči, saj se to smatra kot napad na spletno stran!
lp,
Matjaž Prtenjak
Administrator
Rolle
Prispevkov: 36
Pridružen: Sr Sep 23, 2009 1:28 pm

Re: izluščiti podatek iz HTML tabele

Odgovor Napisal/-a Rolle »

Točno to delam :)
Pol ne bo nič s tistim kar sem imel v mislih...sem se pa vsaj nekaj naučil :)
Odgovori