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

Baffled by the outcome of If, continue, and else in python

这是有问题的代码:

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

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

然而,当我添加一个 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,并没有改变结果。

答案如下:

检查您所有的 200;导致问题的不是 404。 200 中的一个有坏 XML。我发布的大多数变体都可以正常工作。我抽查了我的 200 支,每次抽查我都漏掉了坏的 XML。我想出了如何处理不好的 XML 并且能够完成。