Malplena HTML-tabelo ne ĉiam signifas, ke la respondo enhavas neniujn proksimajn rikordojn. Iuj listoj metas JSON-objektojn en JavaScript-vokojn kaj plenigas la vicojn poste.

Por jam akirita fonto uzanta la specifan envolvaĵon gp.insertPrx sekvatan de JSON-objekto:

import ipaddress
import json
import re

decoder = json.JSONDecoder()
endpoints = set()
for marker in re.finditer(r"gp[.]insertPrx\(\s*", html):
    try:
        row, end = decoder.raw_decode(html, marker.end())
        if not isinstance(row, dict):
            continue
        address = ipaddress.ip_address(row["PROXY_IP"])
        port = int(row["PROXY_PORT"], 16)
    except (ValueError, KeyError, TypeError):
        continue
    if 1 <= port <= 65535 and html[end:].lstrip().startswith(");"):
        endpoints.add((str(address), port))

html estas la fonta teksto, ne retumila objekto. La regula esprimo trovas konatan envolvaĵon; JSONDecoder determinas, kie finiĝas ĝia JSON-valoro. Tiel oni evitas provi analizi nestitan JSON nur per regula esprimo.

La havena kampo de la ekzemplo estas eksplicite deksesuma: C38 signifas dekuman 3128. Ne apliku bazon 16 al dekuma kampo de alia provizanto nur ĉar ambaŭ nomiĝas haveno.

Ĉi tio estas analizilo por la indikita formo, ne JavaScript-interpretilo. Objektaj literaloj kun unuoblaj citiloj, komputitaj valoroj kaj aliaj JavaScript-esprimoj bezonas alian dokumentitan datuman interfacon. Ne plenumu arbitran paĝan kodon por akiri liston de finpunktoj.

Validigu la fontan kontrakton kaj tenu protokolajn kampojn aparte. Se la fonto anstataŭe havas plenigitajn HTML-vicojn, uzu vico-an finan punkton eltiraĵon anstataŭ ĉi tiu JavaScript-envolvaĵa analizilo. Eltiri adreson kaj havenon ne pruvas, ke la finpunkto nun ofertas uzeblan proksiman servon.

Rilataj artikoloj