Ошибка TypeError: 'NoneType' object is not subscriptable

234
13 декабря 2017, 22:05

Выдает все ссылки сайта, как сделать так, чтобы выдавалась первая?

link = soup.findAll('div', attrs={'class': 'item-title text-short'})
for div in link:
    print(div.find('a')['href'])

Ошибка

print(div.find('a')['href'])
TypeError: 'NoneType' object is not subscriptable
Answer 1

Метод div.find('a') вернул None, т.к. тег a не был найден, соответственно, None['href'] и вызвал ошибку в вопросе.

Могу предложить проверку:

for div in link:
    a = div.find('a')
    if a:
        print(a['href'])

Или альтернативную проверку:

for div in link:
    a = div.find('a')
    if not a:
        continue
    print(a['href'])
Answer 2

Для сложного поиска я бы лучше css селекторы использовал

soup.select('div.item-title.text-short a')

Данный запрос вернет список всех элементов a, которые находятся внутри тега div с классами item-title и text-short. Далее просто берем первый элемент - это и будет первая ссылка.

А еще лучше не искать нужный элемент по номеру, а задать точное условие по классу или id. Это не сильно усложнит css селекор, зато такой запрос будет более устойчив к изменениям страницы

READ ALSO
Перемещение строки из одной таблицы в другую JS

Перемещение строки из одной таблицы в другую JS

ЗдравствуйтеПомогите пожалуйста решить задачку

223
Кнопка, которая выводит числа в консоль от 1 до n. В зависимости от числа нажатий

Кнопка, которая выводит числа в консоль от 1 до n. В зависимости от числа нажатий

Есть простая html страница с одной кнопкойПри каждом нажатии будет генерироваться список с цифрами

220
Обновление Google Map каждой секунды

Обновление Google Map каждой секунды

Есть база даных с координатами автомобиляБаза обновляется каждую секунду

218