python - 在函数之间传递两个变量
问题描述
编辑我弄得一团糟!我真的很抱歉!问题与最后 2 个打印语句无关。当我没有主意时添加了这些。整个问题是关于传递title
和final_price
形成并在主体和主体中使用它们check_price
。send_email
我刚刚碰到砖墙,不知道在这里找到答案。我试图根据 YT 上的一些指南创建网络抓取工具。然而,由于我缺乏知识和经验,我陷入了如何传递 2 个变量title
以及 final_price
从函数传递check_price()
到函数的问题上send_mail()
如果我尝试仅使用纯文本发送没有这些变量的电子邮件,一切都会奏效。
import os
import smtplib
import requests
from email.message import EmailMessage
from bs4 import BeautifulSoup
EMAIL_ADDRESS = os.environ.get('GMAIL_USER')
EMAIL_PASSWORD = os.environ.get('GMAIL_PASSWORD')
URL_AMZ = 'https://www.amazon.de/Logitech-kabelgebundene-fortschrittlicher-Muskelbelastung-fortschrittliche/dp/B07FNHV4MW/ref=sr_1_3?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=26227QRRLWQHF&keywords=logitech+mx+vertical&qid=1571861245&sprefix=logitech+mx+%2Caps%2C342&sr=8-3'
# URL_MBNK = 'https://www.mbank.pl/serwis-ekonomiczny/kursy-walut/'
URL_GGL ='https://www.google.com/search?rlz=1C1GCEU_plPL839PL839&sxsrf=ACYBGNSHqUQOq6lZRXHyeKLPAd0peUegqg%3A1571862894642&ei=brmwXevuJuaFk74P1Mi12A8&q=euro&oq=euro&gs_l=psy-ab.3..0i71l8.0.0..1236884...0.2..0.0.0.......0......gws-wiz.D2K7kmd_GB8&ved=0ahUKEwjr3eHLnbPlAhXmwsQBHVRkDfsQ4dUDCAs&uact=5'
headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
def check_price():
# global title
# global final_price
page_amaz = requests.get(URL_AMZ, headers=headers)
# page_mbnk = requests.get(URL_MBNK, headers=headers)
page_ggl = requests.get(URL_GGL, headers=headers)
soup_amaz = BeautifulSoup(page_amaz.content, 'html.parser')
# soup_mbnk = BeautifulSoup(page_mbnk.content, 'html.parser')
soup_ggl = BeautifulSoup(page_ggl.content, 'html.parser')
title = soup_amaz.find(id='productTitle').get_text()
price = soup_amaz.find(id='priceblock_ourprice').get_text()
converted_price = float(price[0:-2].replace(',','.'))
# convert_ratio = soup_mbnk.find(id="currencies").get_text()
convert_ratio_ggl = soup_ggl.find('div','dDoNo vk_bk').get_text()
clean_convert_ratio = float(convert_ratio_ggl[0:4].replace(',','.'))
final_price = converted_price * clean_convert_ratio
if(final_price > 200):
send_email()
return title, final_price
def send_email():
title, final_price = check_price()
msg = EmailMessage()
msg['Subject'] = f'Zmiana ceny produktu {title}' #% (title)
msg['From'] = EMAIL_ADDRESS
msg['To'] = 'I know it's bit to late... but here was my email'
msg.set_content(f'Cena {final_price} -- Link:{URL_AMZ}') # % (final_price ,URL_AMZ))
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login(EMAIL_ADDRESS , EMAIL_PASSWORD)
smtp.send_message(msg)
print("Mail Wysłany")
#print(title)
#print(final_price)
编辑问题已解决。我,先生,感谢所有的帮助。
下面固定和清理的代码。
import requests
import smtplib
import os
from bs4 import BeautifulSoup
from email.message import EmailMessage
EMAIL_ADDRESS = os.environ.get('GMAIL_USER')
EMAIL_PASSWORD = os.environ.get('GMAIL_PASSWORD')
URL_AMZ = 'https://www.amazon.de/Logitech-kabelgebundene-fortschrittlicher-Muskelbelastung-fortschrittliche/dp/B07FNHV4MW/ref=sr_1_3?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=26227QRRLWQHF&keywords=logitech+mx+vertical&qid=1571861245&sprefix=logitech+mx+%2Caps%2C342&sr=8-3'
URL_GGL ='https://www.google.com/search?rlz=1C1GCEU_plPL839PL839&sxsrf=ACYBGNSHqUQOq6lZRXHyeKLPAd0peUegqg%3A1571862894642&ei=brmwXevuJuaFk74P1Mi12A8&q=euro&oq=euro&gs_l=psy-ab.3..0i71l8.0.0..1236884...0.2..0.0.0.......0......gws-wiz.D2K7kmd_GB8&ved=0ahUKEwjr3eHLnbPlAhXmwsQBHVRkDfsQ4dUDCAs&uact=5'
headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
def check_price():
page_amaz = requests.get(URL_AMZ, headers=headers)
page_ggl = requests.get(URL_GGL, headers=headers)
soup_amaz = BeautifulSoup(page_amaz.content, 'html.parser')
soup_ggl = BeautifulSoup(page_ggl.content, 'html.parser')
title = soup_amaz.find(id='productTitle').get_text()
final_title = title.strip() # variable title contain monstrocity that contained 5 8x \r\n above and belowe title.
price = soup_amaz.find(id='priceblock_ourprice').get_text()
converted_price = float(price[0:-2].replace(',', '.'))
convert_ratio_ggl = soup_ggl.find('div','dDoNo vk_bk').get_text()
clean_convert_ratio = float(convert_ratio_ggl[0:4].replace(',','.'))
final_price = converted_price * clean_convert_ratio
if final_price > 200:
send_email(final_title, final_price)
def send_email(final_title, final_price):
msg = EmailMessage()
msg['Subject'] = f'Zmiana ceny produktu {final_title}'
msg['From'] = EMAIL_ADDRESS
msg['To'] = 'EMAIL_ADDRESS'
msg.set_content(f'Cena {final_price} -- Link:{URL_AMZ}')
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login(EMAIL_ADDRESS , EMAIL_PASSWORD)
smtp.send_message(msg)
print("Mail Wysłany")
check_price()
后来我遇到了生成
由变量引起的Send_email()
错误
的墙(它没有从上面和下面的所有空行中删除。ValueError: Header values may not contain linefeed or carriage return characters
title
再一次非常感谢大家。
解决方案
我相信您获取变量的方式title
很好final_price
,应该可以。
但是,最后两个打印不应该工作,因为它们在 send_email() 函数之外,因此title
是final_price
未知的。您是否尝试过将 print 放入函数中并调用它?
更新:
我现在看到了错误,您正在调用send_email()
insidecheck_price()
和check_price()
inside send_email()
,这可能导致无休止的循环。
为了解决这个问题,如果您要调用的函数是check_price()
,您可以send_email()
接受两个参数并在调用时传递它们。所以,check_price()
你会这样做:
...
if(final_price > 200):
send_email(title,final_price)
...
然后send_email
将如下:
def send_email(title,final_price):
msg = EmailMessage()
...
更新 2:
您还在单引号字符串中使用撇号:
'I know it's bit to late... but here was my email'
你应该做:
"I know it's bit to late... but here was my email"
推荐阅读
- python - 没有成功读取字典值中的字符串?
- java - 如何在 Java 中运行 MongoDB 查询
- swift - RealityKit – 如何以编程方式禁用模型的重力?
- r - 为什么 convolve() 不能交换?最终结果取决于卷积的顺序
- regex - 为什么破折号会弄乱正则表达式搜索?
- websocket - Socketio 错误:@sio.event AttributeError:“客户端”对象没有属性“事件”
- postgresql - 相当于“包含”的运算符
- javascript - 如何从 wdio 配置文件的 afterTest 挂钩中访问测试运行的文件名?
- python - 如何从数据框中设置熊猫系列索引并用其他数据填充系列?
- c# - 创建 ac# 类以接受 JSON 数组