AttributeError при использовании BeautifulSoup - PullRequest
0 голосов
/ 19 октября 2018

Я пишу скрипт для генерации файлов JSON, и у меня возникла небольшая проблема.

import requests
from bs4 import BeautifulSoup

url = requests.get('https://www.perfectimprints.com/custom-promos/20492/Beach-Balls.html')
source = BeautifulSoup(url.text, 'html.parser')

product_feed = source.find('div', id_="pageBody")

products = product_feed.find_all('div', class_="product_wrapper")

single_product = products[0]

product_name = single_product.find('div', class_="product_name")
product_name = product_name.a.text

sku = single_product.find('div', class_="product_sku")
sku = sku.text

def get_product_details(product):
  product_name = product.find('div', class_="product_name").a.text
  sku = single_product.find('div', class_="product_sku").text
  return {
    "product_name": product_name,
    "sku": sku
  }

all_products = [get_product_details(product) for product in products]
print(all_products)

В ответ я получаю сообщение об ошибке: Traceback (most recent call last): File "scrape.py", line 9, in <module> products = product_feed.find_all('div', class_="product_wrapper") AttributeError: 'NoneType' object has no attribute 'find_all'

Из моего прочтения это потому, что он ничего не находит с классом product_wrapper, но это не имеет никакого смысла.

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Глядя на исходный код сайта, элемент с id = "pageBody" является div, а не h1.Поэтому, когда вы используете source.find, возвращается None.Попробуйте:

...
product_feed = source.find('div', id_="pageBody")
...
0 голосов
/ 19 октября 2018

Вам не нужно product_feed, удалите его и измените следующую строку на:

products = source.find_all('div', class_="product_wrapper")

Можно проверить в конце: print(len(all_products)) 48

0 голосов
/ 19 октября 2018

Проблема в том, что product_feed = source.find('h1', id_="pageBody") возвращает None.Я попробовал ваш код и product_feed = source.find_all('h1') возвращает только 1 элемент без идентификатора.

...