检索XML文件,解析数据并打印出来

问题描述 投票:0回答:1

我是python的新手,已经为这个任务苦苦挣扎了一段时间。我有一个输入文件,其中列出了三个URL。我想使用请求在URL处获取XML文档,并在尝试检索URL并将该值包括为消息的一部分时记录一条INFO消息。这是输入文件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")
python xml parsing url request
1个回答
0
投票

您应该使用其他更有效的(IMHO)库。我简化了代码:

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

从那里开始,代码与您的问题相同。

但是,由于这是一个xml文件,因此最好改用xpath方法(同样是IMHO)。在这种情况下,看起来可能没有什么大不同,但是在xml变得非常复杂(并且经常如此)的情况下,xpath更为优越。 xpath方法看起来像这样(我将try / except块替换为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
© www.soinside.com 2019 - 2024. All rights reserved.