首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在函数之间传递两个变量

在函数之间传递两个变量
EN

Stack Overflow用户
提问于 2019-10-24 12:22:50
回答 5查看 181关注 0票数 2

编辑我制造了巨大的混乱!我真的很抱歉!问题不是关于最后的2打印声明。这些都是在我没有主意的时候加进去的。整个问题是关于将titlefinal_pricecheck_price传递到send_email,并在身体和主题中使用它们。

我刚撞到砖墙,不知道在这里找答案。根据YT的一些指南,我尝试创建了网络刮刀。然而,由于我缺乏知识和经验,我在这个问题上一直停留在如何将2变量titlefinal_price从函数check_price()传递到函数send_mail()上。

如果我尝试用纯文本发送没有这些变量的电子邮件,一切都会正常工作。

代码语言:javascript
复制
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)

编辑问题解决了。我感谢所有的帮助。

以下是固定和清洁的代码。

代码语言:javascript
复制
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()生成由变量title引起的ValueError: Header values may not contain linefeed or carriage return characters错误(它不是从上面和下面的所有空行中分割的)。

再一次向大家表示感谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-10-24 12:34:34

我相信你获得变量titlefinal_price的方法很好,它应该能工作。

但是,最后两个输出不应该工作,因为它们位于send_email()函数之外,因此titlefinal_price是未知的。你试过把打印放到函数中并调用它吗?

更新:

我现在看到了错误,您在check_price()中调用了check_price(),在send_email()中调用了check_price(),这会导致一个永无止境的循环

要解决这个问题,如果要调用的函数是check_price(),可以让send_email()接受两个参数,并在调用它们时传递它们。因此,在check_price()中,您可以这样做:

代码语言:javascript
复制
...
if(final_price > 200):
   send_email(title,final_price)
...

然后send_email将如下所示:

代码语言:javascript
复制
def send_email(title,final_price):
   msg = EmailMessage()
   ...

更新2:

您还在单引号字符串中使用撇号:

代码语言:javascript
复制
'I know it's bit to late... but here was my email'

你应该这样做:

代码语言:javascript
复制
"I know it's bit to late... but here was my email"
票数 4
EN

Stack Overflow用户

发布于 2019-10-24 12:33:38

您的错误是由于您的打印语句超出了您的功能。两种解决方案。

备选案文1

代码语言:javascript
复制
title, final_price = check_price() 
print(title) 
print(final_price)

选项2

或者直接在你的邮件功能里面。

代码语言:javascript
复制
def send_email(): 
    title, final_price = check_price() 
    msg = EmailMessage() 
    msg['Subject'] = f'Zmiana ceny produktu {title}' #% (title) 
    msg['From'] = EMAIL_ADDRESS 
    msg['To'] = EMAIL_ADDRESS  
    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) 

错误

代码语言:javascript
复制
Traceback (most recent call last):
  File "/mnt/c/_KOD_/github/Web-Scraper/Scraper.py", line 58, in <module>
    print(title)
NameError: name 'title' is not defined
票数 0
EN

Stack Overflow用户

发布于 2019-10-24 12:36:00

要将变量传递到函数中,在定义函数时,需要在括号中定义它们。

代码语言:javascript
复制
def functionName(variable1, variable2)

然后使用它们时,将值传递到函数中。

代码语言:javascript
复制
send_email(title, price)

在您从上一个函数获得这些值之后,可以使用:

代码语言:javascript
复制
title, price = check_price()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58541319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档