вот оскорбительный кусок кода:
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, не изменило результат.
Ответ таков:
Проверьте все свои 200; это был не 404, который вызывал проблему. Один из 200 имеет плохой XML. Большинство вариантов, которые я выложил, работают и работают отлично. Я проводил выборочную проверку своих 200, и при каждой выборочной проверке я пропускал проверку с плохим XML Я понял, как справиться с плохим XML, и смог это сделать.
SyntaxError
) и отступы наelse
во втором блоке действительно важно; если он хоть немного ошибается, то случайно код делает совершенно разные вещи.