Анализ таблицы Python BS4, возвращающий пустой список - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь разобрать таблицу прокси по следующей ссылке https://www.proxy -list.download / SOCKS5 Используя элемент inspect, я вижу, что в элементе 'tbody' есть элементы 'tr' и внутри них элементы 'td'.

Однако, когда я пытаюсь получить к ним доступ и извлекать прокси из каждой строки и столбца, создается впечатление, что их не существует.

Он просто возвращает пустой список.

Я попытался переключить синтаксический анализ lxml на html и получить доступ к tbody без его класса. Я просто не совсем уверен, почему я могу напечатать переменную 'soup' и получить этот вывод

<tbody class="table-hover" id="tabli">
</tbody>

но не получить вывод из строк и т. Д.

import requests
from bs4 import BeautifulSoup, NavigableString
from selenium import webdriver

#While Loop Control Variable to Make Sure We Get a Working Proxy
successful_access = False

#Pulls the HTML of Our Proxy Website
website_url = requests.get("https://www.proxy-list.download/SOCKS5")
#Makes a Soup Variable That Turns Raw HTML Into "Parse-able" Data
soup = BeautifulSoup(website_url.content,"lxml")
#Puts The Table Object Into The "table" Variable
table = soup.find('tbody', attrs={'class':'table-hover'})
rows = table.find_all('tr')
print(rows)

#Initializes an Empty List for All Proxies
proxy_list = []

#For Each Row in Our List of Rows, We Extract The IP Number and Port, Appending Them To Our List Of IPs
for row in rows:
    cols = rows.find_all('td')
    ip = cols[0]
    port = cols[1]
    fullip = ip + ":" + port
    proxy_list.append(fullip)

Нет выхода для

print(rows)

строка, и, естественно, список "proxy_list" также пуст.

[]

1 Ответ

0 голосов
/ 10 июня 2019

Используйте конечную точку API, возвращающую json, который кормит эту страницу. Вы можете найти его на вкладке сети браузера при обновлении URL-адреса, который вы указали.

import requests

r = requests.get('https://www.proxy-list.download/api/v0/get?l=en&t=socks5').json()
print(r[0]['LISTA'])

Мне нравится этот формат, но вы можете использовать панд, чтобы выплевывать фрейм данных

import requests
import pandas as pd

r = requests.get('https://www.proxy-list.download/api/v0/get?l=en&t=socks5').json()
df = pd.io.json.json_normalize(r[0]['LISTA'])
print(df)
...