Задать вопрос
@EugeneVKruglov

Как побороть проблему при парсинге с помощью BeatifulSoup?

Добрый день! При попытке парсить таблицу на сайте с помощью BeatifulSoup натолкнулся на непонятную проблему: удается получить список полей таблицы, но не получается обратиться к элементам по индексу, возникает ошибка "IndexError: list index out of range". Подозреваю, что это может быть как-то связано с тем, что BeatifulSoup выдает результаты поиска не в виде обычного list, а в виде bs4.element.resultset, хотя пишут, что действия с последним такие же, как со списком.
Как получить значения элементов этого списка по индексу?
(частично использован код из этого вопроса)

import requests
from bs4 import BeautifulSoup as BS

def test_2():
	url = 'https://actual-phlebology.ru/afpatient-metki/'
	response = requests.get(url)
	soup = BS(response.text, features = 'html.parser')
	rows = soup.find('table', class_ = 'tcont countLines').find_all('tr') # Ищем в html тег 'table'
	for row in rows: # Проходимся по всем строкам. При каждой итерации в row у нас будет следующая строка таблицы вместе с html тегами.
		cells = row.find_all('td') # Ищем в текущей строке таблицы все теги 'td'. В html td - это тег ячейки.
		tag_list = [cell.text for cell in cells]
		print(tag_list, len(tag_list), type(tag_list))
		# print(tag_list, tag_list[0], len(tag_list), type(tag_list)) # здесь возникает ошибка, независимо от индекса

Часть вывода в консоль, если запускать в исходном виде:
['', 'Нужно ли пить флеботоники при тромбозе глубоких вен?', '✓', '✓', 'https://actual-phlebology.ru/afpatient/nuzhno-li-pit-flebotoniki-pri-tromboze-glubokih-ven/', 'тромбы\n\n\nлекарства от варикоза\n\n\nпопулярные вопросы\n\n\nмифы о варикозе'] 6 <class 'list'>
['', 'Как болят артерии и вены? Подходы к лечению', '✓', '✓', 'https://actual-phlebology.ru/afpatient/kak-bolyat-arterii-i-veny-podhody-k-lecheniyu/', 'болезни сосудов\n\n\nболи в ногах'] 6 <class 'list'>    
['', 'Профессиональные отеки нижних конечностей и методы их коррекции', '✓', '✓', 'https://actual-phlebology.ru/afpatient/professionalnye-oteki-nizhnih-konechnostey-i-metody-ih-korrektsii/', 'профилактика\n\n\nотеки'] 6 <class 'list'>
['', 'Как справиться с венозной болью?', '✓', '✓', 'https://actual-phlebology.ru/afpatient/kak-spravitsya-s-venoznoy-bolyu/', 'популярные вопросы\n\n\nболи в ногах\n\n\nлечение варикоза без операции'] 6 <class 'list'>

Вывод в консоль, если закомментировать 1-й print и раскомментировать 2-й:
Traceback (most recent call last):
  File "d:\Distrib\Mine\Python\AF_PatientBot\to_have_in_mind.py", line 222, in <module>
    test_2()
  File "d:\Distrib\Mine\Python\AF_PatientBot\to_have_in_mind.py", line 194, in test_2
    print(tag_list, len(tag_list), type(tag_list), tag_list[0])
IndexError: list index out of range
  • Вопрос задан
  • 46 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
Lord_of_Rings
@Lord_of_Rings Куратор тега Python
Дунадан - северный странник. Злой, но очень добрый
У меня вывод выглядит так:
spoiler
[] 0 <class 'list'>
['', ' Нужно ли пить флеботоники при тромбозе глубоких вен? ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/nuzhno-li-pit-flebotoniki-pri-tromboze-glubokih-ven/', ' \n\nтромбы\n\n\nлекарства от варикоза\n\n\nпопулярные вопросы\n\n\nмифы о варикозе\n\n\n'] 6 <class 'list'>
['', ' Как болят артерии и вены? Подходы к лечению ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/kak-bolyat-arterii-i-veny-podhody-k-lecheniyu/', ' \n\nболезни сосудов\n\n\nболи в ногах\n\n\n'] 6 <class 'list'>
['', ' Профессиональные отеки нижних конечностей и методы их коррекции ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/professionalnye-oteki-nizhnih-konechnostey-i-metody-ih-korrektsii/', ' \n\nпрофилактика\n\n\nотеки\n\n\n'] 6 <class 'list'>
['', ' Как справиться с венозной болью? ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/kak-spravitsya-s-venoznoy-bolyu/', ' \n\nпопулярные вопросы\n\n\nболи в ногах\n\n\nлечение варикоза без операции\n\n\n'] 6 <class 'list'>
['', ' Самодиагностика тромбоза, попытка самолечения ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/samodiagnostika-tromboza-popytka-samolecheniya/', ' \n\nтромбы\n\n\n'] 6 <class 'list'>
['', ' Самая надежная и безболезненная операция на венах ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/samaya-nadezhnaya-i-bezboleznennaya-operatsiya-na-venah/', ' \n\nсовременная хирургия варикоза\n\n\n'] 6 <class 'list'>
['', ' Тромбоз: чулок/гольф/ничего? ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/tromboz-chulok-golf-nichego/', ' \n\nкомпрессионный трикотаж\n\n\nтромбы\n\n\n'] 6 <class 'list'>
['', ' Больные «внутренние вены» на ногах с избытком жировой клетчатки. ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/bolnye-vnutrennie-veny-na-nogah-s-izbytkom-zhirovoy-kletchatki/', ' \n\nболи в ногах\n\n\nлипедема\n\n\n'] 6 <class 'list'>
['', ' Опасно ли закрывать клеем вены? ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/opasno-li-zakryvat-kleem-veny/', ' \n\nмифы о варикозе\n\n\nспорт и болезни вен\n\n\n'] 6 <class 'list'>
['', ' Действительно эффективные упражнения при заболеваниях вен ', ' ✓ ', ' ✓  ', 'https://actual-phlebology.ru/afpatient/deystvitelno-effektivnye-uprazhneniya-pri-zabolevaniyah-ven/', ' \n\nпрофилактика\n\n\nмифы о варикозе\n\n\nспорт и болезни вен\n\n\n'] 6 <class 'list'>


и т. д.
Ничего не видете? Зато я вижу, что при первой итерации список у вас получается пустым: [] 0 <class 'list'> Это и вызывает ошибку
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@EugeneVKruglov Автор вопроса
Aragorn, большое спасибо! Просто не заметил этот первый пустой элемент (это заголовок таблицы, который не содержит данных).
Изменил код так и проблема исчезла.
del rows[0]
for row in rows:
...
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы