对 Python 中的 If、continue 和 else 的结果感到困惑

Posted

技术标签:

【中文标题】对 Python 中的 If、continue 和 else 的结果感到困惑【英文标题】:Baffled by the outcome of If, continue, and else in python 【发布时间】:2018-12-06 01:56:30 【问题描述】:

这是有问题的代码:

data = requests.get(searchURL, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)
feed_data = data.content
d = feedparser.parse(feed_data)

tickets=[]
for ticketNum in d['entries'] :
    tickets.append(ticketNum['title'])


s = requests.Session()
s.get(ticketsBaseUrl, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)


for ticket in tickets :

    ticket_page = s.get(ticketsBaseUrl+ticket, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False )

    if ticket_page.status_code == 404 :
        print('ticket %s data 404, skipping' %ticket)
        continue

现在这段代码本身会导致 404 响应的预期 3 次跳过。

但是,当我添加一个 else 时:

data = requests.get(searchURL, auth=HTTPBasicAuth(config.flxusername, 

config.flxpassword), verify=False)
feed_data = data.content
d = feedparser.parse(feed_data)

tickets=[]
for ticketNum in d['entries'] :
    tickets.append(ticketNum['title'])


s = requests.Session()
s.get(ticketsBaseUrl, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)


for ticket in tickets :

    ticket_page = s.get(ticketsBaseUrl+ticket, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False )

    if ticket_page.status_code == 404 :
        print('ticket %s data 404, skipping' %ticket)
        continue
    else :
        etree = ET.fromstring(ticket_page.content)
        print(etree)

最后的 404 页面内容被传递给 etree 并且脚本出错了。

当我只执行 else: print(ticket_page.status_code) 时,它会打印 3 条错误消息,其余的会打印 200 条。当我放入 etree 块时,它才开始尝试解析最终的 404。真让人抓狂。

我在这里缺少什么?

尝试了另一种选择:

data = requests.get(searchURL, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)
feed_data = data.content
d = feedparser.parse(feed_data)

tickets=[]
for ticketNum in d['entries'] :
    tickets.append(ticketNum['title'])


s = requests.Session()
s.get(ticketsBaseUrl, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)


for ticket in tickets :

    ticket_page = s.get(ticketsBaseUrl+ticket, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False )

    if ticket_page.status_code == 404 :
        print('ticket %s data 404, skipping' %ticket)
        continue

    etree = ET.fromstring(ticket_page.content)

这也不会跳过最后的 404。

测试了一个较小的代码段:

if ticket_page.status_code == 404 :
    print(str(ticket_page.status_code) + ' ' + ticket)
    continue
else :
    print(ET.fromstring(ticket_page.content))

失败;试图从列表中的最后一个 404 中提取字符串。

if ticket_page.status_code == 404 :
    print(str(ticket_page.status_code) + ' ' + ticket)
    continue
else :
    print('continued')

工作,打印 3 404 并继续打印其他所有内容。 (这在技术上不正确;它实际上处理了其他所有内容)

反其道而行之:

if ticket_page.status_code == 200:
    print(ET.fromstring(ticket_page.content))
else :
    print(str(ticket_page.status_code) + ' ' + ticket)
    continue

if ticket_page.status_code != 200:
    print(str(ticket_page.status_code) + ' ' + ticket)
    continue
else :        
    print(ET.fromstring(ticket_page.content))


if ticket_page.status_code != 200:
    print(str(ticket_page.status_code) + ' ' + ticket)
    continue

print(ET.fromstring(ticket_page.content))

同样的结果。在最后的 404 上仍然失败

甚至

for ticket in tickets :

    ticket_page = s.get(ticketsBaseUrl+ticket, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False )

    if ticket_page.status_code != 200:
        tickets.pop()

在列表中留下 404。

这是引发解析错误的 XML:

b'<?xml version="1.0" standalone="yes"?>\n\n<error><statusCode>404</statusCode><name>Not Found</name><description>The server has not found anything matching the request URI: Ticket not found</description></error>\n\n'

最新测试:

if 'statusCode' in tree_root.decode() : 
    print(ticket)
    continue

这给了我 3 张预期的票。

if 'statusCode' in tree_root.decode() : 
    print(ticket)
    continue
etree = ET.fromstring(ticket_page.content.decode())    
print(etree)

这在第 3 次 404 票证上失败。添加延迟,认为这是因为在最终 404 之前有大量 200 造成的,但并没有改变结果。

【问题讨论】:

请重新检查/修复显示的缩进。第一个代码块肯定是错误的(会引发SyntaxError),第二个代码块中else 上的缩进真的很重要;如果它有一点点错误,不小心,代码会做完全不同的事情。 你好,你能分享一下门票清单中的例子吗?您收到哪 3 条错误消息? 票只是一个列表,其中包含要传递给票库 URL 的 GUID,例如 00000e03-c06e-4417-985b-0437bc40b5d7,它要么返回 200 和一些 XML 内容,要么返回 404 和类似 XML 的内容,但不被库识别为 XML。所以我试图跳过阅读 404 页的尝试。 啊,是的,我看到缩进上发生了什么,让我解决它;它在我的脚本中。 Haramoz 3 404's 当我发出简单打印时,如果 404 是:404 00000e03-c06e-4417-985b-1faae4955e13 404 0000179c-2efc-4001-8bd8-0437bc40b5d-2017 404-4084-400699 -5bd0eb2f46e3 当我在 IF 之后添加任何其他内容时,它会尝试处理最后一个。 【参考方案1】:

答案如下:

检查所有 200 个;导致问题的不是 404。 200 个中的一个有错误的 XML。我发布的大多数变体都能正常工作。我在抽查我的 200 个,每一次抽查我都错过了一个带有错误 XML 的抽查。我想出了如何处理错误的 XML 并且能够完成。

【讨论】:

以上是关于对 Python 中的 If、continue 和 else 的结果感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

Python控制流:break和continue

Python:为啥 if-else 一行语句在 else 中不能与 continue 一起使用?

Python if while continue break语句

Python入门教程第20篇 continue语句

for循环和if条件中的continue语句[关闭]

[第三节] Python流程控制语句 - if, while, for, break, continue