【问题标题】:Python - Print out once when hit the if-else statementPython - 点击 if-else 语句时打印一次
【发布时间】:2018-06-18 09:16:18
【问题描述】:

所以我一直在尝试使用监视器来玩 abit - 对于那些不知道什么是监视的人 - 基本上这意味着您正在检查某些东西等元素、url 或其他内容,然后再次检查是否它已经改变了。

我想要做的是程序从一开始就发出请求以获取网站 URL - url 将自动重定向到 /password 或没有它。

然后我要做的是检查密码是否包含 URL - 如果包含.. 打印出密码页面已启动,然后仅发送一次不和谐,而它可以打印出密码页面已启动作为命令,但它应该只打印出不和谐ONCE!

如果密码从 /password 变为无密码则相反 - 它应该说密码页面已关闭,然后打印出它已关闭并发送到不和谐 ONCE 已关闭 p>

这就是我所做的,并且

url = 'mrcnoir'

while True:
        try:
            password_page = requests.get('https://{}.com'.format(url))
            password_page.raise_for_status()

        except:
            print('Error checking password page! - https://{}.com'.format(url))
            continue



        else:
            # *************---If password up---**************

            if ('password' in password_page.url):

                        # Password page is up
                        print('Password page is up! - ' + 'https://{}.com'.format(url))

                        if not ('password' in password_page.url):

                            # No password page -> password page


                            # *************---Send to discord---**************

                            print("SENDING...1") #Discord function will be added later

                            time.sleep(random.randint(6, 12))


            # *************---If password down---**************

            else:
                # Password page is down
                print('Password page is down! - ' + 'https://{}.com'.format(url))
                if ('password' in password_page.url):

                    # Password page -> no password page


                    # *************---Send---**************

                    print("SENDING...2") #Discord function will be added laterthis print...

                    time.sleep(random.randint(6, 12))

        # *************---Retry between 6-12 random.---**************
        finally:
            time.sleep(random.randint(6, 12))

我现在遇到的问题是它永远不会进入 else 函数内的 if 语句,这意味着它永远不会命中 “发送到不和谐”函数 ...

我怎样才能让它通过以便它发送到我的不和谐(现在不需要函数,函数内部的简单打印现在就可以了)只一次

可能是我把 if 语句也弄错了......


更新:

对不起,我可能已经累了,我刚做了这个,我想我现在可能做得对了

url = 'mrcnoir'
password = False

while True:
        try:
            password_page = requests.get('https://{}.com'.format(url), timeout=5)
            password_page.raise_for_status()

        except requests.exceptions.RequestException as err:
            print('Error checking password page! - https://{}.com'.format(url) + ' - ' + str(err))
            continue



        else:
            # *************---If password up---**************

            if ('password' in password_page.url):
                        # Password page is up
                        if password != True:
                          password = True
                          print('Password page is up! - ' + 'https://{}.com'.format(url))

            elif ('password' not in password_page.url):
                        if password != False:
                          password = False
                          print('Password page is down! - ' + 'https://{}.com'.format(url))
                          time.sleep(random.randint(6, 12))

                         # No password page -> password page

        # *************---Retry between 6-12 random.---**************
        finally:
            time.sleep(random.randint(6, 12))

【问题讨论】:

  • 你要问多少次这个问题?你昨天问了两次!
  • @user2413548 我从来没有得到答案,但我现在确实更好地清理了自己,我认为这是现在最可以理解的。我确实意识到我上次确实问错了我的问题,这可能会让其他人感到困惑 - 现在我已经清理了自己,希望现在更正确:)
  • 您确实意识到您通过检查“密码”是否在 password_page.url 中来打开一个 if 块,然后仅当“密码”为 not 时才想调用您的函数在password_page.url 中?那应该如何工作?在您的代码到达if not ('password' in password_page.url): 行时,已经确定“密码”实际上在 password_page.url 中。
  • @shmee 您实际上是正确的 - 我现在已经做了新的更新。在这种情况下看起来更正确吗?
  • 从控制流的角度来看,它看起来更好。但是,如果在您第一次进入循环时 PW 页面已关闭,则不会打印任何内容,因为 password 已经为 False。 elif 是不必要的,条件 'password' in password_page.url 只能有两个布尔状态,所以 else 就足够了。可以删除条件周围的括号,在这种情况下,您不需要并在 python 中使用它们。无论如何,finally 块中的 time.sleep() 将始终被执行。如果 PW 页面关闭,除非您想要两次延迟,否则您可以将其从 elif 路径中删除

标签: python if-statement while-loop logic


【解决方案1】:

你能打印raise_for_status() 返回的值,看看它返回了什么吗?因为成功命中它会返回None,并且它永远不会进入第一个elseif 块。在这里阅读:quickstart python requests

import requests

url = 'https://mrcnoir.com'

res = requests.get(url)
print(res.raise_for_status())
print(res.status_code)

输出:

None
200

Process finished with exit code 0

【讨论】:

  • 正确 - 这就是我得到的正确答案。我一开始可能做错了,现在我做了更新:)
  • 如果这对您有帮助,请接受这个答案?
  • 好吧,我的意思是该页面确实可以正常工作-但这不是我要寻找的答案。我的问题是关于 if 和 else 语句先生。 :)