Python 返回对象 "placement" 而不是 float

Python returning object "placement" instead of float

我正在创建一个用于评估股票价值的网络抓取工具。我遇到的问题是我的代码 returns 一个对象 "placement" (不知道应该叫什么)而不是值。

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))  

如果我在 __init__ 中打印 lastSplit 它 returns 我想要的值 15.53 但是当我尝试通过函数 getMedianPE 我刚刚得到 Median + <__main__.Guru object at 0x0000016B0760D288>

非常感谢您的宝贵时间!

您似乎在尝试将函数对象转换为浮点数。只需将 return float(Guru.getMedianPE) 更改为 return float(Guru.MedianPE)

getMedianPE是一个函数(在class的一部分时也称为对象方法),所以你需要用括号调用它。如果你不带括号调用它,你会得到 method/function 本身而不是调用 method/function.

的结果

另一个问题是 getMedianPE returns 函数 Guru.getMedianPE 而不是值 Guru.MedianPE。我认为您不希望 MedianPE 成为 class 变量 - 您可能只想在 init 中将其设置为默认值 0,以便每个对象都有自己的 median_PE值。

此外,在您的 init 方法中包含所有抓取代码也不是一个好主意。应该将其移至您在实例化对象后调用的 scrape() 方法(或其他名称)。

最后,如果你要打印一个对象,有一个str方法很有用,所以我在这里添加了一个基本的。

因此,将所有这些评论放在一起,这里是建议的代码重构。

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