Nid yw tabl HTML gwag bob amser yn golygu nad oes cofnodion dirprwyol yn yr ymateb. Mae rhai rhestrau'n rhoi gwrthrychau JSON mewn alwadau JavaScript ac yn llenwi'r rhesi'n ddiweddarach.

Ar gyfer ffynhonnell a gafwyd eisoes sy'n defnyddio'r lapiwr penodol gp.insertPrx ac yna gwrthrych JSON:

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))

testun y ffynhonnell yw html, nid gwrthrych porwr. Mae'r mynegiad rheolaidd yn canfod lapiwr hysbys; mae JSONDecoder yn penderfynu ble mae ei werth JSON yn gorffen. Mae hyn yn osgoi ceisio dosrannu JSON nythog gyda mynegiad rheolaidd yn unig.

Mae maes porth yr enghraifft yn hecsadegol yn bendant: mae C38 yn golygu 3128 degol. Peidiwch â chymhwyso sail 16 i faes degol darparwr arall dim ond oherwydd bod y ddau'n cael eu galw'n borth.

Dosrannydd ar gyfer y fformat a nodwyd yw hwn, nid dehonglydd JavaScript. Mae llythrennau gwrthrych â dyfynodau sengl, gwerthoedd a gyfrifwyd ac ymadroddion JavaScript eraill angen rhyngwyneb data dogfennol arall. Peidiwch â gweithredu cod tudalen mympwyol i gael rhestr o bwyntiau terfyn.

Dilyswch gontract y ffynhonnell a chadwch feysydd protocol ar wahân. Os oes gan y ffynhonnell resi HTML wedi'u llenwi yn lle hynny, defnyddiwch dynnu pwyntiau terfyn fesul rhes yn hytrach na'r dosrannydd lapiwr JavaScript hwn. Nid yw tynnu cyfeiriad a phorth yn profi bod y pwynt terfyn yn cynnig gwasanaeth dirprwyol defnyddiadwy ar hyn o bryd.

Erthyglau cysylltiedig