Вы перезаписываете cols
во время цикла. Последняя длина cols
равна нулю, следовательно, ваша ошибка.
for row in table.find_all('div')[16:]:
cols = row.find_all('div')
print(len(cols))
Запустите приведенное выше, и вы увидите, что cols
заканчивается на длине 0.
Это может также произойти в другом месте цикла, поэтому вы должны проверить длину и также решить, соответствует ли ваша логикануждается в обновлении. Кроме того, вам необходимо учитывать наличие дочернего тега a
.
Таким образом, вы можете, например, сделать следующее (требуется bs4 4.7.1+):
answers = []
for row in table.find_all('div')[16:]:
cols = row.find_all('div:has(>a)')
if len(cols) >= 3:
answers.append({
'namePlayer': cols[3].a.text
})
Обратите внимание, что answers
имеет правильный отступ, поэтому вы работаете с каждым значением cols
. Это может не соответствовать вашему конкретному случаю использования, так как я не уверен, каков ваш желаемый результат. Если вы укажете желаемый результат, я обновлю его соответствующим образом.
РЕДАКТИРОВАТЬ:
playerNames
from bs4 import BeautifulSoup as bs
import requests
r = requests.get('https://jaze.ru/forum/topic?id=50&page=1')
soup = bs(r.content, 'lxml')
answer_blocks = soup.select('[id^=answer_]')
names = [i.text.strip() for i in soup.select('[id^=answer_] .left-side a')]
unique_names = {i.text.strip() for i in soup.select('[id^=answer_] .left-side a')}
Вы можете сохранить порядок и дедублировать сOrderedDict (это @ Michael - другие решения в этом Q & A)
from bs4 import BeautifulSoup as bs
import requests
from collections import OrderedDict
r = requests.get('https://jaze.ru/forum/topic?id=50&page=1')
soup = bs(r.content, 'lxml')
answer_blocks = soup.select('[id^=answer_]')
names = [i.text.strip() for i in soup.select('[id^=answer_] .left-side a')]
unique_names = OrderedDict.fromkeys(names).keys()