Получить XML файлов, проанализировать данные и распечатать их - PullRequest
0 голосов
/ 16 апреля 2020

Я новичок в python и уже давно борюсь с этой задачей. У меня есть входной файл с тремя URL-адресами, перечисленными внутри. Я хочу получить документ XML по URL-адресу, используя запросы, и зарегистрировать сообщение INFO, когда я пытаюсь получить URL-адрес и включить значение как часть сообщения. Вот URL входного файла

http://kitty.ninja/file1.xml
http://kitty.ninja/badurl.xml
http://kitty.ninja/file3.xml

А вот мой код, я до сих пор заканчиваю с кодом выхода:

import logging
import requests
from xml.etree import ElementTree as ET
r = requests.get('http://kitty.ninja/file1.xml')
print("Now attempting to get data at:", ('http://kitty.ninja/file1.xml'))
if r.status_code == 200:
  print("200 - Successfully retrieved:", ('http://kitty.ninja/file1.xml'))
  tree = ET.fromstring("hw8-input")
  root = tree.getroot()
  for customer in root.findall('customer'):
      name = customer.find('name').text
      checking_account = customer.find("checking_account").text
      try:
          savings_account = customer.find('savings_account').text
      except AttributeError:
          savings_account = "None"
      print(name, "Checking Account:", checking_account, "Savings Account:", savings_account)
elif r.status_code == 404:
  print("Resource not found")

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

@ Джек Флитинг прав. Вот еще одно решение для вашей справки.

from simplified_scrapy import SimplifiedDoc,req,utils
url = 'http://kitty.ninja/file1.xml'
html = req.get(url)
doc = SimplifiedDoc(html)
for customer in doc.customers:
  print(customer.id.text,customer.name.text,customer.savings_account.text,customer.checking_accounts.text)

Результат:

12 Susan Stone None ['465498435']
34 Roger Roman 64565435 ['165498165', '654684321']
56 Gary Grooman None ['654846546']
78 Janet Jones None ['954387383']
91 Nancy Noons 5645648465 ['684981651']

Вот еще несколько примеров. https://github.com/yiyedata/simplified-scrapy-demo/blob/master/doc_examples

0 голосов
/ 16 апреля 2020

Вы должны использовать другую, более эффективную (IMHO) библиотеку. Я немного упростил код:

from lxml import etree
root = etree.fromstring(r.content)

Оттуда код такой же, как в вашем вопросе.

Однако, поскольку это файл xml, вам лучше ( опять же, ИМХО) вместо этого использовать методы xpath. Может показаться, что это не имеет большого значения в этом случае, но там, где xml серьезно усложняется (и это часто бывает), xpath намного лучше. Методы xpath выглядели бы так (я заменил блок try / исключением на блок if / else, но это просто личное предпочтение):

for customer in root.xpath('//customer'):
    checking_account = customer.xpath("./checking_account")[0].text
    if len(customer.xpath('./savings_account'))>0:
        savings_account = customer.xpath('./savings_account')[0].text
    else:
        savings_account = "None"
    name = customer.xpath('./name')[0].text
    print(name, "Checking Account:", checking_account, "Savings Account:", savings_account)

В любом случае выходные данные одинаковы:

Susan Stone Checking Account: 465498435 Savings Account: None
Roger Roman Checking Account: 165498165 Savings Account: 64565435
Gary Grooman Checking Account: 654846546 Savings Account: None
Janet Jones Checking Account: 954387383 Savings Account: None
Nancy Noons Checking Account: 684981651 Savings Account: 5645648465
...