不明白为什么在这段将 int 转换为 float 的代码中会出现 IndentationError

问题描述

在尝试构建一个可以寻找价格折扣的 HTML 抓取工具时,我不断收到 IndentationError: unindent does not match any outer indentation level 错误。但是当将 int 转换为 float 时。

converted_price = float(price[0:5])
if(converted_price < 40.99):
        send_mail()
    print(converted_price)
    print(title.strip())
    if(converted_price > 40.99):
        send_mail() 

我收到错误消息。我做错了什么?

完整代码

import requests
from bs4 import BeautifulSoup
import smtplib

URL = 'https://www.amazon.de/Toilettendeckel-Absenkautomatik-Antibakterieller-Urea-Duroplast-Edelstahlscharnier/dp/B0881PKQ2H/?_encoding=UTF8&smid=AKQL6N75FLK4O&pd_rd_w=hTIPC&pf_rd_p=d051a36d-9331-41c8-9203-e7d634b1ee23&pf_rd_r=3TS01EKWNMYSRC1147X1&pd_rd_r=d950f9b1-8e9a-4913-b266-9b7a36ad21f5&pd_rd_wg=GLsoO&ref_=pd_gw_unk'

headers = {"User-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/87.0.4280.88 Safari/537.36'}

def check_price():
    page = requests.get(URL,headers=headers)

    soup = BeautifulSoup(page.content,'html.parser')

    title = soup.find(id="productTitle").get_text()
    price = soup.find(id="priceblock_saleprice").get_text
    converted_price = float(price[0:5])

if(converted_price < 40.99):
        send_mail()

    print(converted_price)
    print(title.strip())

    if(converted_price > 40.99):
        send_mail()


def send_mail():
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.ehlo()
    server.starttls()
    server.ehlo()

    server.login('madbro88a@gmail.com','gsplmdqkaavnuxnb')

    subject = 'Price fell down!'
    body = 'https://www.amazon.de/Toilettendeckel-Absenkautomatik-Antibakterieller-Urea-Duroplast-Edelstahlscharnier/dp/B0881PKQ2H/?_encoding=UTF8&smid=AKQL6N75FLK4O&pd_rd_w=hTIPC&pf_rd_p=d051a36d-9331-41c8-9203-e7d634b1ee23&pf_rd_r=3TS01EKWNMYSRC1147X1&pd_rd_r=d950f9b1-8e9a-4913-b266-9b7a36ad21f5&pd_rd_wg=GLsoO&ref_=pd_gw_unk'

    msg = f"Subject: {subject}\n\n{body}"

    server.sendmail(
        'mail1','mail2',msg
    )
    print('Email has been sent!')

    server.quit()


price_check()

解决方法

错误的根源在这部分:

if(converted_price < 40.99):
        send_mail()

在 Python 中,在任何需要缩进的行(例如 ifwhiledef 等)之后,您必须将以下行缩进 one 制表符,或使用空格的等效项。 至少一个空格。缩进块中的所有后续行都应缩进到同一级别。约定是使用 4 个空格(感谢 mkrieger1)。空格在 Python 中非常重要。

在您的示例中,您将行 send_mail() 两个 缩进比 if 语句更深。如果将 send_mail() 的缩进减少 1,则编译器错误将得到解决。

更正后的代码应该是:

if(converted_price < 40.99):
    send_mail()

请注意,在您的完整代码中,以下块缩进了一个太少:

if(converted_price < 40.99):
        send_mail()

    print(converted_price)
    print(title.strip())

    if(converted_price > 40.99):
        send_mail()

整个块都需要缩进以位于 def check_price(): 函数内。

,

完整代码 if(converted_price < 40.99):check_price() 函数的一部分,因此您必须将其缩进。