我想在我的主要功能中使用一个类,但并不确切地怎么做。 到目前为止,这是我尝试过的。以下代码仅用于演示目的。
已将代码修改为@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()
答案 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)
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()