Ошибка '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 шт):

Автор решения: RomanR

Проблема в том, что если Вы проверите 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 например.

→ Ссылка