Не тип не вызывается - PullRequest
       32

Не тип не вызывается

0 голосов
/ 17 марта 2020

У меня проблема с моим python сценарием, я пытаюсь проанализировать цену и имя и сравнить цену и результат, если он ниже вашего бюджета или выше, я использовал это на другом сайте, но здесь, кажется, я получаю ошибка. да, я знаю, что у меня устаревший импорт, я все еще его реализую.

КОД:

import bs4
from bs4 import BeautifulSoup
import requests
from os import system

def job():
    def printing():
        if price1 < priceinput:
            print("price lower")
        else:
            print("price lower")

    price = soup.find(class_="price")
    price2 = int(price.replace(".", ""))
    name = soup.find(itemprop="name").get("content")
    print(price, price2, name)

# link
urlinput = input("LINK : ")
priceinput = int(input("BUDGET :"))
url = ("private" + urlinput)

page = requests.get(url)

soup = BeautifulSoup(page.text, "lxml")

job()

ОШИБКА:

Traceback (most recent call last):
  File "/home/PycharmProjects/SocialScraper/venv/test.py", line 29, in <module>
    job()
  File "/home/PycharmProjects/SocialScraper/venv/test.py", line 16, in job
    price2 = int(price.replace(".", ""))
TypeError: 'NoneType' object is not callable

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Ошибка

TypeError: 'NoneType' object is not callable

Ясно, что указанная здесь область действия html не имеет элемента с классом price, поэтому значение цены возвращается как NonType, Попытка вызвать replace на NoneType выдаст erorr, так как NoneType не имеет функций для вызова на

NoneType.replace() # NoneType has no function called replace

, поэтому вы можете изменить эту строку

price = soup.find(class_="price")

на

price = soup.find(class_="price") or ""

или вы можете поместить любое значение по умолчанию, которое подходит, когда суп не может найти значение для цены.

Для более сложной отладки по этой проблеме, я рекомендую использовать ipdb в вашем коде, чтобы убедиться, что он работает как ожидается https://pypi.org/project/ipdb/ вот пример решения этой проблемы

    price = soup.find(class_="price").text
    price2 = int(price.replace(' ', '').split('.')[0][1:])
0 голосов
/ 18 марта 2020

Если find () не может ничего найти, возвращается None (см. Документация по красивому супу )

Ваш код не распространяется на этот случай. Поэтому, если ваш поиск в строке

price = soup.find(class_="price")

ничего не даст, цена равна Нет . И, как уже говорилось в описании ошибки, объекты NoneType не могут быть вызваны. Это заставляет вашу программу обрабатывать sh, когда она пытается вызвать replace () для NoneType цена в строке

price2 = int(price.replace(".", ""))

Чтобы избежать этого, вы может сделать простую проверку, как это:

def job():
    # ...
    price = soup.find(class_="price")
    if price is not None:
        price2 = int(price.replace(".", ""))
        name = soup.find(itemprop="name").get("content")
        print(price, price2, name)
    else:
        print("No price found")
...