Ошибка в работе парсера: 'NoneType' object has no attribute 'get_text'
Код:
import requests
from bs4 import BeautifulSoup
URL = 'https://auto.ria.com/newauto/marka-jeep/'
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 OPR/73.0.3856.329 (Edition Yx 03)', \
'accept': '*/*'}
HOST = 'https://auto.ria.com'
def get_html(url, params=None):
r = requests.get(url, headers=HEADERS, params=params)
return r
def get_content(html):
soup = BeautifulSoup(html, 'html.parser')
items = soup.find_all('div', class_='proposition')
cars = []
for item in items:
uah_price = item.find('span', class_='size15')
if uah_price:
uah_price = uah_price.get_text().replace(' • ', '')
else:
uah_price = 'Цену уточняйте'
cars.append({
'title': item.find('div', class_='proposition').get_text(strip=True),
'link': HOST + item.find('h3', class_='proposition_name').get(href),
'usd_price': item.find('span', class_='green').get.text(),
'uah_price': uah_price,
'city': item.find('div', class_='proposition_region').find_next('strong').get_text(),
})
return cars
print(cars)
def parse():
html = get_html(URL)
if html.status_code == 200:
cars = get_content(html.text)
else:
print('Error')
parse()
Ошибка:
Traceback (most recent call last):
File "C:/Users/User/Desktop/Django/mysite/art/parser1.py", line 47, in <module>
parse()
File "C:/Users/User/Desktop/Django/mysite/art/parser1.py", line 42, in parse
cars = get_content(html.text)
File "C:/Users/User/Desktop/Django/mysite/art/parser1.py", line 28, in get_content
'title': item.find('div', class_='proposition').get_text(strip=True),
AttributeError: 'NoneType' object has no attribute 'get_text'
Ответы (1 шт):
Автор решения: Jack_oS
→ Ссылка
Ошибка из-за того, что вы берете все предложения по
items = soup.find_all('div', class_='proposition')
а потом ищете для каждого из них title в том же proposition:
'title': item.find('div', class_='proposition').get_text(strip=True)
Если немного изменить условия для items:
items = soup.find_all('div', class_='proposition_area')
и парсинга каждого элемента:
cars = []
for item in items:
cars.append({
'title': item.find('h3', class_='proposition_name').text,
'equip': item.find('div', class_='proposition_equip').text,
'link': HOST + item.find('a')['href'],
'usd_price': item.find('span', class_='green').text.replace(' ', '').replace('$', ''),
'uah_price': item.find('span', class_='grey size13').text.replace(' ', '').replace('грн', ''),
'city': item.find('div', class_='proposition_region').find('strong').text,
})
то в cars будет то, что вы ищете, 18-ть предложений с данной страницы:
{'title': ' Jeep Compass 2020', 'equip': 'Longitude 2.4 9АТ (175 к.с) AWD ', 'link': 'https://auto.ria.com/newauto/auto-jeep-compass-1810690.html', 'usd_price': '32200', 'uah_price': '907718', 'city': 'Одеса '}
{'title': ' Jeep Wrangler 2018', 'equip': 'Sahara 3D 2.0i AT (272 к.с) AWD ', 'link': 'https://auto.ria.com/newauto/auto-jeep-wrangler-1810694.html', 'usd_price': '53700', 'uah_price': '1513803', 'city': 'Одеса '}
{'title': ' Jeep Grand Cherokee 2018', 'equip': 'Limited 3.0TD АТ (250 к.с) ', 'link': 'https://auto.ria.com/newauto/auto-jeep-grand-cherokee-1810691.html', 'usd_price': '55000', 'uah_price': '1550450', 'city': 'Одеса '}
...
{'title': ' Jeep Wrangler 2020', 'equip': 'Rubicon Unlimited 2.0i AT (272 к.с) AWD ', 'link': 'https://auto.ria.com/newauto/auto-jeep-wrangler-1846544.html', 'usd_price': '79632', 'uah_price': '2245043', 'city': 'Київ '}
{'title': ' Jeep Wrangler 2020', 'equip': 'Rubicon Unlimited 2.2 CRDI AT (200 к.с) AWD ', 'link': 'https://auto.ria.com/newauto/auto-jeep-wrangler-1830576.html', 'usd_price': '66900', 'uah_price': '1886085', 'city': 'Київ '}
{'title': ' Jeep Grand Cherokee 2020', 'equip': 'base SRT 6.4 AT (477 к.с) AWD ', 'link': 'https://auto.ria.com/newauto/auto-jeep-grand-cherokee-1166274.html', 'usd_price': '98900', 'uah_price': '2788248', 'city': 'Київ '}
ps бонус - описание комплектации в 'equip' ;)