如何在我的主要功能中使用一个类

时间:2019-11-19 18:55:41

标签: python class main

我想在我的主要功能中使用一个类,但并不确切地怎么做。 到目前为止,这是我尝试过的。以下代码仅用于演示目的。

已将代码修改为@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()

3 个答案:

答案 0 :(得分:0)

首先,您必须在所有方法中将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循环才能以更具可读性的方式显示它。我将其显示为列表。

我跳过了while循环,因为它对我没有用。我还更改了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()

答案 1 :(得分:-1)

我从您的问题中了解到的是,您想创建该类的对象并在参数构造函数中传递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函数中使用它们的基本疑问现在已经清楚了

谢谢。

答案 2 :(得分:-1)

您需要返回要在类test之外访问的变量

class test:
        def content(self,r):
            abc = 1 + r
            defg = r*2
            return abc,defg 

您的功能在这里

def main():
        Test1 = test()
        variable1 ,variable2 =Test1.content(133)
        print(variable1)
        print(variable2)
main()