Python возвращая объект "размещение" вместо float - PullRequest
0 голосов
/ 09 апреля 2020

Я создаю веб-скребок, который будет использоваться для оценки акций. Проблема, которую я получил, состоит в том, что мой код возвращает объект «размещение» (не уверен, как он должен называться) вместо значения.

import requests

class Guru():

    MedianPE = 0.0

    def __init__(self, ticket):


        self.ticket = ticket

        try:

            url = ("https://www.gurufocus.com/term/pettm/"+ticket+"/PE-Ratio-TTM/")

            response = requests.get(url)
            htmlText = response.text
            firstSplit = htmlText
            secondSplit = firstSplit.split("And the <strong>median</strong> was <strong>")[1]
            thirdSplit = secondSplit.split("</strong>")[0]

            lastSplit = float(thirdSplit)

            try:
                Guru.MedianPE = lastSplit
            except:
                print(ticket + ": Median PE N/A")
        except:
            print(ticket + ": Median PE N/A")


    def getMedianPE(self):
        return float(Guru.getMedianPE)





g1 = Guru("AAPL")
g1.getMedianPE
print("Median + " + str(g1))  

Если я печатаю lastSplit внутри __init__, он возвращает желаемое значение 15.53, но когда я пытаюсь получить его с помощью функции getMedianPE, я просто получаю Median + <__main__.Guru object at 0x0000016B0760D288>

Большое спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

getMedianPE - это функция (также называемая объектным методом, когда она является частью класса), поэтому ее необходимо вызывать в скобках. Если вы вызываете его без скобок, вы получите сам метод / функцию, а не результат вызова метода / функции.

Другая проблема состоит в том, что getMedianPE возвращает функцию Guru.getMedianPE, а не значение Guru.MedianPE. Я не думаю, что вы хотите, чтобы MedianPE была переменной класса - вы, вероятно, просто хотите установить для нее значение по умолчанию 0 в init , чтобы у каждого объекта было свое собственное значение median_PE.

Кроме того, не стоит включать весь код очистки в ваш метод init . Его следует перенести в метод scrape () (или другое имя), который вы вызываете после создания экземпляра объекта.

Наконец, если вы собираетесь напечатать объект, полезно иметь str , поэтому я добавил сюда базовый c один.

Итак, собрав все эти комментарии, вот рекомендуемый рефакторинг вашего кода.

import requests

class Guru():
    def __init__(self, ticket, median_PE=0):
        self.ticket = ticket
        self.median_PE = median_PE

    def __str__(self):
        return f'{self.ticket} {self.median_PE}'

    def scrape(self):
        try:
            url = f"https://www.gurufocus.com/term/pettm/{self.ticket}/PE-Ratio-TTM/"
            response = requests.get(url)
            htmlText = response.text
            firstSplit = htmlText
            secondSplit = firstSplit.split("And the <strong>median</strong> was <strong>")[1]
            thirdSplit = secondSplit.split("</strong>")[0]
            lastSplit = float(thirdSplit)
            self.median_PE = lastSplit
        except ValueError:
            print(f"{self.ticket}: Median PE N/A")

Тогда вы запускаете код

>>>g1 = Guru("AAPL")
...g1.scrape()
...print(g1)
AAPL 15.53
0 голосов
/ 09 апреля 2020

Похоже, вы пытаетесь привести объект функции к плавающей точке. Просто измените return float(Guru.getMedianPE) на return float(Guru.MedianPE)

...