Подскажите, почему получаю такую ошибку: AttributeError: 'NoneType'

noattribute

Новичок
Пользователь
Дек 15, 2021
1
0
1
Добрый день, в данный момент парсю сайт и получаю ошибку AttributeError: 'NoneType' object has no attribute 'get_text'
Посмотрела предыдущую, со схожей темой, вопрос. Но, предложенное решение моей задаче не помог. Подскажите, почему именно эта ошибка выходит?
Python:
import requests
from bs4 import BeautifulSoup

CSV = 'kvartiry.csv'
HOST = ''
URL = ''
HEADERS = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}

def get_html(url, params=''):
    r = requests.get(url, headers=HEADERS, params=params)
    r.encoding = 'utf8'
    return  r

# html = get_html(URL)
# print(html)

def get_content(html):
    soup = BeautifulSoup(html, "html.parser")
    items = soup.find_all('div', class_='a-card__inc')
    kvartiry = []

    for item in items:
        kvartiry.append (
            {
                'link_kvartiry': HOST + item.find('div', class_='a-card__title').find('a').get('href'),
                'title_kvartiry': item.find('div', class_='a-card__title').get_text(strip=True)
                'location_kvartiry': item.find('div', class_='a-card__subtitle').get_text(strip=True),
                'price_kvartiry': item.find('div', class_='a-card__price').get_text(strip=True),
                'year_kvartiry': item.find('div', class_='a-card__text-preview').get_text(strip=True)
            }
        )
    return kvartiry

def save_document(item, path):
    with open(path, 'w',newline='') as file:
        writer = csv.writer(file, delimiter=';')
        writer.writerow(['Link', 'Title', 'Location', 'Price', 'Year of construction'])
        for item in items:
            writer.writerow([item['link_kvartiry'], item['title_kvartiry'],item['location_kvartiry'],item['price_kvartiry'], item['year_kvartiry']])

def parser():
    PAGENATION = input('Which page? ')
    PAGENATION = int(PAGENATION.strip())
    html = get_html(URL)
    if html.status_code == 200:
        kvartiry = []
        for page in range(1, PAGENATION):
            print(f'Processing: {page}')
            html = get_html(URL, params={'page': page})
            kvartiry.extend(get_content(html.text))
            save_document(kvartiry, CSV)
        pass
    else:
        print('Error')

html = get_html(URL)
print(get_content(html.text))
 
Последнее редактирование:

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Ещё не запускал, сейчас проверю, но в 99% случаев это значит что просто нет элемента который к которого вы хотите взять текст

То есть сначала вы берете список элементов
Python:
items = soup.find_all('div', class_='a-card__inc')

А потом когда вы делаете в цикле отсев
Python:
for item in items:
        kvartiry.append (
            {
                'title_kvartiry': item.find('div', class_='a-card__title').get_text(strip=True)
                'location_kvartiry': item.find('div', class_='a-card__subtitle').get_text(strip=True),
                'price_kvartiry': item.find('div', class_='a-card__price').get_text(strip=True),
                'year_kvartiry': item.find('div', class_='a-card__text-preview').get_text(strip=True)
            }
        )
Один из find ничего не находит (например нет div с классом a-card_price) и возвращает None, а когда вы пытаетесь вызвать None.get_text() скрипт падает с ошибкой

Решения:
1) Обернуть цикл в try/except
2) Сначала искать, проверять что результат не None и после брать текст
 
  • Мне нравится
Реакции: noattribute

Форум IT Специалистов