Озадачен результатами If, продолжай, а остальное в python

1

вот оскорбительный кусок кода:

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.

Однако, когда я добавлю еще:

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. Он только начинает пытаться проанализировать последние 404, когда я вставляю часть etree. Это сводит с ума.

Что мне здесь не хватает?

Пробовал другую альтернативу:

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 билете. Добавление задержки, думая, что это происходило из-за тонны 200 перед финальными 404, не изменило результат.

  • 1
    Пожалуйста, проверьте / исправьте отображаемый отступ. Первый блок кода, безусловно , неправильно (поднимет SyntaxError ) и отступы на else во втором блоке действительно важно; если он хоть немного ошибается, то случайно код делает совершенно разные вещи.
  • 1
    привет, не могли бы вы поделиться примером того, что в списке билетов? а какие 3 сообщения об ошибках вы получаете?
Показать ещё 8 комментариев
Теги:
python-3.x
if-statement
continue

1 ответ

0

Ответ таков:

Проверьте все свои 200; это был не 404, который вызывал проблему. Один из 200 имеет плохой XML. Большинство вариантов, которые я выложил, работают и работают отлично. Я проводил выборочную проверку своих 200, и при каждой выборочной проверке я пропускал проверку с плохим XML Я понял, как справиться с плохим XML, и смог это сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню