Python: «if i.find ('a') ['id'] не равно None:" возвращает TypeError. Объект 'NoneType' не является подписанным, но print () возвращает значение - PullRequest
0 голосов
/ 01 декабря 2018

Что я пытаюсь сделать:

Я пытаюсь написать скрипт, который очищает веб-сайт для информации о продукте.

В настоящее время программа использует цикл for для очисткидля цены продукта и уникального идентификатора.

Цикл for содержит два оператора if, чтобы помешать его очистке NoneTypes.

import requests
from bs4 import BeautifulSoup


def average(price_list):
    return sum(price_list) / len(price_list)


# Requests search data from Website
page_link = 'URL'
page_response = requests.get(page_link, timeout=5)  # gets the webpage (search) from Website
page_content = BeautifulSoup(page_response.content, 'html.parser')  # turns the webpage it just retrieved into a BeautifulSoup-object

# Selects the product listings from page content so we can work with these
product_listings = page_content.find_all("div", {"class": "unit flex align-items-stretch result-item"})

prices = []  # Creates a list to add the prices to
uids = [] # Creates a list to store the unique ids

for product in product_listings:

## UIDS 
    if product.find('a')['id'] is not None:
        uid = product.find('a')['id']
        uids.append(uid)

# PRICES
    if product.find('p', class_ = 'result-price man milk word-break') is not None:# assures that the loop only finds the prices
        price = int(product.p.text[:-2].replace(u'\xa0', ''))  # makes a temporary variable where the last two chars of the string (,-) and whitespace are removed, turns into int
        prices.append(price)  # adds the price to the list

Проблема:

Вкл.if product.find('a')['id'] is not None:, я получаю Exception has occurred: TypeError 'NoneType' object is not subscriptable.

Кто бы ни, если я запускаю print(product.find('a')['id']), я получаю искомое значение, которое меня действительно смущает.Разве это не означает, что ошибка не является NoneType?

Кроме того, if product.find('p', class_ = 'result-price man milk word-break') is not None: работает безупречно.

Что я пробовал:

Я пытался назначитьif product.find('p', class_ = 'result-price man milk word-break') в переменную и затем запустить ее в цикле for, но это не сработало.Я также сделал свою долю в поиске в Google, но не превалирую.Проблема может заключаться в том, что я относительно новичок в программировании и не знаю точно, что искать, но я все еще нашел много ответов, которые, кажется, связаны с проблемами, но это не сработает в моемкод.

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 02 декабря 2018

Просто сделайте промежуточный шаг:

res = product.find('a')

if res is not None and res['id'] is not None:
    uid = product.find('a')['id']
    uids.append(uid)

Таким образом, если find возвращает None, потому что элемент не был найден, вы не будете пытаться подписать NoneType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...