【问题标题】:Python returning object "placement" instead of floatPython返回对象“放置”而不是浮动
【发布时间】:2020-04-09 18:19:59
【问题描述】:

我正在创建一个用于评估股票的网络爬虫。我遇到的问题是我的代码返回一个对象“放置”(不确定应该调用什么)而不是值。

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,它会返回我想要的值15.53,但是当我尝试通过函数getMedianPE 获取它时,我只会得到Median + &lt;__main__.Guru object at 0x0000016B0760D288&gt;

非常感谢您的宝贵时间!

【问题讨论】:

    标签: python web-scraping stock


    【解决方案1】:

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

    【讨论】:

    • 可悲的是,它不起作用仍然返回相同的Median + &lt;__main__.Guru object at 0x0000016B086368C8&gt;:/
    • 当你调用g1.getMedianPe时,在末尾加上括号,g1.getMedianPE()
    • 谢谢。不知道我是怎么错过的,但它仍然返回Median + &lt;__main__.Guru object at 0x0000016B086368C8&gt;
    • 嗯,将return改为return float(self.MedianPE)并将MedianPE存储在self中,所以self.MedianPE = something在构造函数中。但看起来你得到了答案
    • 我有点……不确定我是否可以按照我最初的意图使用它。感谢您的帮助,希望我能解决它!
    【解决方案2】:

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

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

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

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

    因此,将所有这些 cmets 放在一起,这是一个推荐的代码重构。

    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
    

    【讨论】:

    • 谢谢!这样可行。但是如果我想返回不同的值怎么办。例如,如果我抓取了 4 种不同的值,但想一一返回。另外,如果我想将它作为浮点数返回怎么办?我试过这个def __float__(self): return f'{self.median_PE}'再次感谢您的帮助
    • 如果你有其他的值想要抓取,那么在init中声明它们,然后你可以像median_PE一样在scrape方法中设置它们。
    • f'' 构造用于将变量转换为字符串,因此您不会使用它来返回浮点数。您已经在 scrape 方法中将 median_PE 转换为浮点数。您可以通过将其设置为 0.0 而不是 0 来确保默认值是浮点数。
    • 谢谢,但我无法让它按我想要的方式工作。唯一的方法不能是使用构造函数来获取值,我需要一个单独的函数。
    猜你喜欢
    • 2016-11-07
    • 2020-07-23
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多