Analizează fiecare linie proxy ca o unitate. Dacă aplatizezi toate td care se potrivesc pe pagină și grupezi rezultatele după un număr fix, o adresă dintr-o linie poate fi asociată cu un port din linia următoare atunci când lipsește o celulă sau apare alt tabel.

Pentru HTML-ul pe care aplicația l-a obținut deja, un tabel ale cărui prime două coloane sunt adresa IP și portul poate fi analizat astfel:

import ipaddress
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")
table = soup.select_one(table_selector)
if table is None:
    raise ValueError("Expected proxy table was not found")

endpoints = set()
for row in table.select("tbody tr"):
    cells = row.find_all("td", recursive=False)
    if len(cells) < 2:
        continue
    try:
        address = ipaddress.ip_address(cells[0].get_text(strip=True))
        port = int(cells[1].get_text(strip=True))
    except ValueError:
        continue
    if 1 <= port <= 65535:
        endpoints.add((str(address), port))

html și table_selector sunt intrări ale aplicației. Alege selectorul și maparea coloanelor după marcajul real al sursei. Lista de proxy gratuite este o sursă de înregistrări de puncte finale, dar rândurile ei ar trebui inspectate înainte de a alege acea mapare. Nici un ID de tabel istoric, nici afirmația că o pagină conține exact 300 de înregistrări nu sunt o schemă durabilă.

Mulțimea elimină perechile adresă-și-port duplicate păstrând asocierea fiecărei perechi. Totuși, un import neașteptat cu zero rezultate ar trebui investigat: tabelul s-ar putea să se fi schimbat sau documentul obținut ar putea fi o pagină de verificare în loc de listă.

Păstrează orice protocol anunțat și câmpurile de timp ale verificării lângă punctul final atunci când contează. Extragerea unui IP și a unui port plauzibile stabilește formatul, nu că punctul final oferă în prezent un serviciu HTTP sau SOCKS funcțional.

Rândurile de antet sau de filtru nu sunt puncte finale. Un rând care conține doar celule th este omis, în timp ce câmpurile goale sau care nu sunt adrese eșuează validarea. Nu elimina primul și ultimul rând după poziție: oricare dintre ele poate fi un punct final real după ce se schimbă aspectul paginii.

Articole similare