извлечение нескольких данных из строки таблицы в BS4 - PullRequest
1 голос
/ 19 апреля 2020

в приведенном ниже коде я пытаюсь извлечь IP-адреса и порты http://free-proxy-list.net из таблицы, используя BeautifulSoup.

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

Как я могу разделить IP-адрес и порт?

Вот мой код:

        def get_proxy(self):
            response = requests.get(self.url)
            soup = bs(response.content,'html.parser')
            data_list = [tr for tr in soup.select('tr') if tr.td]

            for i in data_list:
                print(i.text)

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

В вашем коде вместо -

i.text вы можете использовать i.getText(' ,') (или с другим разделителем по вашему выбору, кроме,). Это даст вам IP и порты, разделенные запятыми.

Более того, для удобства вы также можете загрузить список прокси в массив данных.

Внести следующие изменения / дополнения в ваш код -

soup = bs(response.content,'html.parser')

data_list = [tr for tr in soup.select('tr') if tr.td]


data_list2 = [tr.getText(' ,') for tr in soup.select('tr') if tr.td]

#for i in data_list:
      #print(i.text)

df = pd.DataFrame(data_list2,columns=['proxy_list'])

df_proxyList= df['proxy_list'].str.split(',', expand=True)[0:300]

df_proxyList будет выглядеть (с несколькими столбцами мусора) -

enter image description here

1 голос
/ 19 апреля 2020

Попробуйте это. Мне пришлось добавить условие isnumeri c (), чтобы убедиться, что код не содержит данных из другой таблицы, представленной на том же веб-сайте.

from bs4 import BeautifulSoup as bs
import requests
from collections import defaultdict

def get_proxy(URL):
    response = requests.get(url)
    soup = bs(response.content,'html.parser')
    mapping = defaultdict()
    for tr in soup.select('tr'):
        if len(list(tr)) == 8:
            ip_val = str(list(tr)[0].text)
            port_val = str(list(tr)[1].text)
            if port_val.isnumeric():
                mapping[ip_val] = port_val


    for items in mapping.keys():
        print("IP:",items)
        print("PORT:",mapping[items])

if __name__ == '__main__': 
    url = "http://free-proxy-list.net"
    get_proxy(url)
...