Задать вопрос
mr-ZA
@mr-ZA

Парсинг сайта, Python + BeautifulSoup?

Приветствую, пытаюсь спарсить сайт: [ foxtools.ru/Proxy ]
Выдает ошибку выхода за пределы массива, что странно учитывая что строка в приложенном фото должна соответствовать выборке. Ошибка снизу.. что с этим делать?

5cbb5dc89b1e0843640421.png
import requests
from bs4 import BeautifulSoup

def get_html(site):
    r = requests.get(site)
    return r.text

def get_page_data(html):                         #sources
    soup = BeautifulSoup(html, 'lxml')           #(format_in, parser)

    line = soup.find('table', id='theProxyList').find_all('tr')     #resolve table

    for tr in line:
        td = tr.find_all('td')
        ip = td[1].text
        port = td[2].text
        country = td[3].text
        anonym = td[4].text
        types = td[5].text
        time = td[6].text

        data = {'ip': ip,
                'Port': port,
                'Country': country,
                'Anonymize': anonym,
                'Type': types,
                'Time': time}

def main():
    url = 'http://foxtools.ru/Proxy'
    get_page_data(get_html(url))

if __name__ == '__main__':
        main()


Код ошибки:
Traceback (most recent call last):
  File "D:/home/projects/Python/Parser_proxy.py", line 34, in <module>
    main()
  File "D:/home/projects/Python/Parser_proxy.py", line 31, in main
    get_page_data(get_html(url))
  File "D:/home/projects/Python/Parser_proxy.py", line 15, in get_page_data
    ip = td[1].text
IndexError: list index out of range
  • Вопрос задан
  • 4878 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
sanya84
@sanya84
Фанатик Python 3
На первой итерации цикла td возвращает пустой список отсюда и ошибка.
import requests
from bs4 import BeautifulSoup

def get_html(site):
    r = requests.get(site)
    return r.text

def get_page_data(html):                         #sources
    soup = BeautifulSoup(html, 'lxml')           #(format_in, parser)

    line = soup.find('table', id='theProxyList').find_all('tr')     #resolve table

    for tr in line:
        td = tr.find_all('td')
        if td == []:
            continue
        ip = td[1].text
        port = td[2].text
        country = td[3].text
        anonym = td[4].text
        types = td[5].text
        time = td[6].text

        data = {'ip': ip,
                'Port': port,
                'Country': country,
                'Anonymize': anonym,
                'Type': types,
                'Time': time}
        print(data)
def main():
    url = 'http://foxtools.ru/Proxy'
    get_page_data(get_html(url))

if __name__ == '__main__':
        main()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
NeiroNx
@NeiroNx
Программист
Иногда в структуре сайта встречаются изъяны - незнаю намеренно или нет, но они препятствуют парсингу используя простой код, приходится городить огороды и костыли, которые обрабатывают все возможные ситуации.
Ищи,проверяй, возможно там просто нет нужного количества элементов td в одной из строчек, добавляй условия.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:12
10000 руб./за проект
22 дек. 2024, в 19:47
3000 руб./за проект
22 дек. 2024, в 19:03
60000 руб./за проект