[PYTHON] Jak získat hodnotu z webové stránky

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod max118 3. 12. 2020 20:57

Pomohl by nekdo s problemem, kdy chci z pythonu volat htm stranku na web hostingu:
Kód: Vybrat vše
import requests
call_node=requests.get('https://..../nadm_vyska3.htm')

ktera by mela vracet nadmorskou vysku z tridy SMap
Kód: Vybrat vše
<html>
    <head>
        <meta charset="utf-8" />
        <title>api.mapy.cz - ukázka nadmořské výšky</title>
        <script type="text/javascript" src="https://api.mapy.cz/loader.js"></script>
        <script type="text/javascript">Loader.load();</script>
    </head>
    <body>
        <div id="m" style="height:380px"></div>
    </body>
</html>

<script>

var m = new SMap(JAK.gel("m"), SMap.Coords.fromWGS84(14.400307, 50.071853));
m.addDefaultLayer(SMap.DEF_BASE).enable();

function altitudeResponse(a) {
    document.getElementById("m").innerHTML = a;
}

m = SMap.Coords.fromWGS84(14.008597, 50.302383);
m.getAltitude().then(altitudeResponse);
m.getAltitude().then(load);

var url = 'https://...cz/nadm_vyska3.htm';

function load(url, callback) {
  var xhr = new XMLHttpRequest();

  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      callback(xhr.response);
    }
  }
  xhr.open('GET', url, true);
  xhr.send('');
}
</script>


V python (return) get se zda byt vse v poradku
status_code=200, reason=OK
jen nemuzu za boha vyslednou hodnotu nadmorske vysky protlacit do pythonu.
V prohlizeci se hodnota zobrazi.
Diky
max118
Kolemjdoucí

Odeslat příspěvekod Wikan 4. 12. 2020 07:57

Na té stránce je JavaScript, který pravděpodobně tu hodnotu doplní až po načtení stránky.
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 4. 12. 2020 09:41

Ta stranka sama ziskava informaci o vysce v danem bode z URL https://api.mapy.cz/altitude, ale samotna data jsou v nejakem GEO formatu, ktery muze byt proprietarni pro Seznam (request je base64, odpoved je dokonce 2x base64 v sobe).

Obavam se, ze to nebude nic jednoducheho, pokud ti ten format nic nerika.


Kód: Vybrat vše
>>> from base64 import b64decode
>>> b64decode('yhECAWgNZ2V0QWx0aXR1ZGVBdBhAuAIKRdUuQBgKDc5+niBJQA==')
b'\xca\x11\x02\x01h\rgetAltitudeAt\x18@\xb8\x02\nE\xd5.@\x18\n\r\xce~\x9e I@'
>>> b64decode('eWhFQ0FYQlFBd1p6ZEdGMGRYTTR5QTF6ZEdGMGRYTk5aWE56WVdkbElBSlBTd2hoYkhScGRIVmtaUmdBQUFBQUFLQnRRQT09')
b'yhECAXBQAwZzdGF0dXM4yA1zdGF0dXNNZXNzYWdlIAJPSwhhbHRpdHVkZRgAAAAAAKBtQA=='
>>> b64decode(b64decode('eWhFQ0FYQlFBd1p6ZEdGMGRYTTR5QTF6ZEdGMGRYTk5aWE56WVdkbElBSlBTd2hoYkhScGRIVmtaUmdBQUFBQUFLQnRRQT09'))
b'\xca\x11\x02\x01pP\x03\x06status8\xc8\rstatusMessage \x02OK\x08altitude\x18\x00\x00\x00\x00\x00\xa0m@'
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod max118 4. 12. 2020 18:59

Diky za odpovedi
@Vikan: o asynchronni proces by se mela postarat property xhr.onreadystatechange...
@Jirka: Je to asi jasne, bude to ten base64 s kterym si snad python pomoci balicku base64 poradi. Celou dobu jsem to mel pred ocima a netrklo me to
get.text: '<html>\r\n <head>\.....
Jeste jednou diky
max118
Kolemjdoucí

Odeslat příspěvekod Wikan 4. 12. 2020 19:49

To by měla. Jenže tvůj kód ti pouze stáhne HTML dané stránky a JavaScript na ní umístěný už ne. Můžeš zkusit použít třeba Selenium.
https://selenium-python.readthedocs.io/
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 4. 12. 2020 20:11

Ne, nemel jsi to pred ocima - to, co stahujes, ty ti neda nadmorskou vysku. Abys ji ziskal, musel bys volat to API, ktere jsem ti napsal. A tam neni problem base64 (to je trivialni) - problem je to, ze nevis, co v nem ma byt zabaleno.
JirkaVejrazka
Mírně pokročilý


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků