【问题标题】:How do I call a class for use in my main function如何调用一个类以在我的主要功能中使用
【发布时间】:2020-03-15 09:15:48
【问题描述】:

我想在我的主函数中使用一个类,但不知道该怎么做。 这是我到目前为止所尝试的。以下代码仅用于演示目的。

代码已根据@furas 的建议进行了编辑。

import requests
from bs4 import BeautifulSoup
from class.embed import Embed


def request(r):
    s = requests.Session()
    r = s.get(url)
    return r

def data(r):
    soup = BeautifulSoup(r.txt, 'lxml')
    title = soup.select('.ac-ln-title-comingsoon')
    return title

def main():
    url = 'https://www.apple.com/macbook-pro-16/'
    old_title = None
    while True:
        r = request(url)
        title = data(r)
        if title != old_title:
            url = 'https://www.apple.com/macbook-pro-16/specs/'
            embed_class = Embed(url)
            print(price, processor)
        else:
            print('Lorem ipsum')

if __name__ == "__main__":
    main()

这是我的课:

class Embed:
    def __init__(self, url):
        self.r = request(url)
    def content(r):
        soup = BeautifulSoup(self.r.text, 'lxml')
        price = soup.select('.column  large-6').get_text()
        processor = soup.select('.techspecs-column').get_text()

【问题讨论】:

  • 首先你应该在__init__(self, url)中使用self。然后你应该发送url 作为参数embed_class = Embed(url)
  • 你应该在课堂上使用self. - self.r = request(url) - 在其他方法中访问这个请求 - BeautifulSoup(self.r.text, ...)
  • 不要更改有问题的代码,因为这样可能 cmets 不适合您的代码。如果您必须更改代码,请在末尾添加文本"EDIT:"

标签: python class main


【解决方案1】:

首先,您必须在所有方法中使用self 作为第一个参数。你什么时候跑

embed_class.content()

然后 Python 将运行

Embed.content(embed_class)

所以它将实例embed_class分配给self

其次,您应该使用self. 来从一种方法在另一种方法中访问变量。

方法也应该使用return,这样你就可以在方法之外使用它的值。


顺便说一句:

select() 给出列表(即使它只找到一个元素或者它没有找到任何元素)所以你不能使用select().get_text() 但你必须在每个元素上使用get_text() 分别使用for -循环或列表理解。即。

 price = [item.get_text(strip=True) for item in price]

页面有两个价格和两个处理器说明,因此您可能需要for-loop 以更易读的方式显示它。我将其显示为列表。

我跳过了while-loop,因为它对我没用。我还更改了select() 中的类,只获取页面的一部分。


import requests
from bs4 import BeautifulSoup

class Embed:
    def __init__(self, url):
        self.r = request(url)

    def content(self):
        soup = BeautifulSoup(self.r.text, 'lxml')

        price = soup.select('.section-price .column.large-6')
        price = [item.get_text(strip=True) for item in price]

        processor = soup.select('.section-processor')
        processor = [item.get_text(strip=True) for item in processor]

        return price, processor


def request(url):
    s = requests.Session()
    r = s.get(url)
    return r

def data(r):
    soup = BeautifulSoup(r.text, 'lxml')
    title = soup.select('.ac-ln-title-comingsoon')
    title = title[0].get_text()
    return title

def main():
    url = 'https://www.apple.com/macbook-pro-16/'
    old_title = None

    r = request(url)
    title = data(r)
    print(title)

    if title != old_title:
        url = 'https://www.apple.com/macbook-pro-16/specs/'
        embed_class = Embed(url) # it runs only `__init__()`
        price, processor = embed_class.content()
        print(price, processor)
    else:
        print('Lorem ipsum')

if __name__ == "__main__":
    main()

【讨论】:

    【解决方案2】:

    我从您的问题中了解到,您想创建该类的对象并在参数构造函数中传递 url 并在您的主函数中使用它?

    下面应该是你的主要功能:

    def main():
      url = 'https://www.apple.com/macbook-pro-16/'
      old_title = None
      while True:
        r = request(url)
        title = data(r)
        if title != old_title:
            url = 'https://www.apple.com/macbook-pro-16/specs/'
            embed_class = Embed(**url**)
            embed_class.content()
            print(embed_class.price, embed_class.productData)
        else:
            print('Lorem ipsum')
    

    下面应该是您的 Embed 类:

    class Embed:
    def __init__(url):
        r = request(url)
    def content(r):
        soup = BeautifulSoup(r.text, 'lxml')
        price = soup.select('.column  large-6').get_text()
        processor = soup.select('.techspecs-column').get_text()
        productData= soup.select('#name for extracting productdata#').get_text()
    

    请不要复制我编写的相同代码。首先尝试从中理解。让我知道是否有任何问题。您可能会怀疑 productdata 是如何来的。并且您必须搜索 productData 的查询名称,否则您可能知道从哪里获取 productdata。其余代码,我的意思是您对如何调用类成员并在 main 函数中使用它们的基本疑问现在很清楚.

    谢谢。

    【讨论】:

    • 没有productData,这是一个错字,现已更正。为什么一定要打embed_class.content(),我的意思是embed_class = Embed(**url**)不够?
    • @julian Embed(url) 仅运行 __init__。要获得价格,您还必须运行 content()。但是这个答案中的代码充满了错误。
    猜你喜欢
    • 2016-05-30
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多