Ошибка 'NoneType' object has no attribute 'text' в парсере на python
import requests
from bs4 import BeautifulSoup
import csv
HOST = 'https://www.dns-shop.ru'
URL = 'https://www.dns-shop.ru/catalog/17a892f816404e77/noutbuki/'
HEADERS = {
'User-Agent': ''
}
response = requests.get(URL, headers = HEADERS)
soup = BeautifulSoup(response.content, 'html.parser')
items = soup.findAll('div', class_ = 'catalog-item')
comps = []
for item in items:
comps.append({
'title': item.find('a', class_ = 'ui-link').text,
'price': item.find('div', class_ = 'product-min-price__current').text,
'link': item.find('a', class_ = 'ui-link').get('href')
})
with open('test.csv', 'w', newline = '') as csvfile:
fieldnames = ['Title', 'Price', 'Link']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
global comp
for comp in comps:
writer.writerow({'Title': comp['title'], 'Price': comp['price'], 'Link': HOST + comp['link']})
В парсинге новичок, столкнулся вот с такой проблемой. Ошибку выдает на 19 строчке кода.
'price': item.find('div', class_ = 'product-min-price__current').text,
Ответы (1 шт):
Проблема в том, что если Вы проверите items в полученной html, то Вы не найдете там информации о цене. Я не специалист, но опытным путем я установил, что она загружается каким то скриптом, после того, как страница была отображена в браузере. В общем, я решал такое тем, что парсил через selentium.
Вот ниже пример, он открывает страницу в окне браузера, ждет секунду и спарсивает ее. Дальше уже можно работать супом. Сохранение в файл реализуйте уже сами.
from bs4 import BeautifulSoup
import time
from selenium import webdriver
import csv
browser = webdriver.Chrome()
browser.get("https://www.dns-shop.ru/catalog/17a892f816404e77/noutbuki/")
time.sleep(1)
main_page = browser.page_source
soup = BeautifulSoup(main_page, "html.parser")
items = soup.findAll('div', class_ = 'catalog-item')
comps = []
browser.close()
for item in items:
comps.append({
'title': item.find('a', class_='ui-link').text,
'price': item.find('div', class_='product-min-price__current').text,
'link': item.find('a', class_='ui-link').get('href')
})
for comp in comps:
print(comp)
Вот тут можно скачать подходящий chrome driver.https://chromedriver.chromium.org/downloads Можно и другие использовать, firefox например.