2015-12-05 2 views
0

У меня возникли проблемы с разбором XML. Я довольно новичок в python, поэтому я, возможно, не понимаю концепцию, или я могу пропустить шаг.Как правильно разобрать этот XML? Python - ElementTree

XML-фрагмент:

<result created="2015-12-05T12:46:00-06:00" host="www.systemmonitor.us"  status="OK"> 
<items> 
<client> 
    <clientid>67300</clientid> 
    <name> 
    <![CDATA[ ACME Company ]]> 
    </name> 
<site> 
    <siteid>85663</siteid> 
    <name> 
    <![CDATA[ Los Angeles ]]> 
    </name> 
    <workstations/> 
    <servers> 
    <server> 
     <id>597207</id> 
     <name> 
     <![CDATA[ SERVER1 ]]> 
     </name> 
     <offline> 
     <description> 
      <![CDATA[ OFFLINE - MAINTENANCE MODE ]]> 
     </description> 
     <startdate>2015-11-25</startdate> 
     <starttime>01:40:07</starttime> 
     </offline> 
    </server> 
    <server> 
     <id>2252213</id> 
     <name> 
      <![CDATA[ SERVER2 ]]> 
     </name> 
     <overdue> 
     <description> 
      <![CDATA[ Overdue ]]> 
     </description> 
     <startdate>2015-11-25</startdate> 
     <starttime>01:57:40</starttime> 
     </overdue> 
     </server> 
    </servers> 
    </site> 
</client> 

Мне нужно извлечь некоторые элементы, так что я могу раздвинуть эти элементы в нашу систему CRM.

Вот мой код:

import requests 
import xml.etree.ElementTree as ET 

url = "https://www.systemmonitor.us/api/" 
querystring = {"apikey":"SUPERSECRETAPIKEY","service":"list_failing_checks"} 

response = requests.request("GET", url, params=querystring) 
msg = response.text 
tree = ET.ElementTree(ET.fromstring(msg)) 

client_ids = tree.find('clientid') 

print client_ids 

Если я пытаюсь получить client_id от msg.find («» идентификатору клиента) он только возвращает целое число. 144. (Я предполагаю, что это число раз, когда оно найдено в xml.) Если я использую tree.find ('clientid'), я получаю []. Я еще не пытался перебирать данные, потому что я не могу даже найти его.

Я думаю, что я пробовал любую другую комбинацию, которую я могу найти и думаю, но я не могу решить эту проблему. find(), findall() и т. д. Мой мозг болит от хлопания его на столе.

Мне нужно было бы изолировать клиента, имя, просрочку/описание.

Может кто-нибудь объяснить, что я сделал неправильно или что мне не хватает? Спасибо.

ответ

1

Вы должны дать полный путь:

client_ids = tree.find('items/client/clientid') 

или поиск всех вхождений с:

client_ids = tree.findall('.//clientid') 

Чтобы получить содержимое элементов использовать, например

for client_id in client_ids: 
    print client_id.text 
+0

Оба возвращения <Элемент 'clientid' на 0x10eba8d90>. Разве он не должен возвращать 67300? – MBH

+0

@MBH: см. Текст. – Daniel

+0

OMG. Огромное спасибо. Теперь я могу ясно видеть шаги. Я чувствую себя глупо, когда эта головокружение видна, когда наконец появляется куча чисел. – MBH

Смежные вопросы