2016-10-04 3 views
0

Вот мой выход XML:Извлечение конкретной информации из XML (Google Distance Matrix API)

<DistanceMatrixResponse> 
<status>OK</status> 
<origin_address> 
868-978 Middle Tennessee Blvd, Murfreesboro, TN 37130, USA 
</origin_address> 
<destination_address> 
980-1060 Middle Tennessee Blvd, Murfreesboro, TN 37130, USA 
</destination_address> 
<row> 
<element> 
<status>OK</status> 
<duration> 
<value>19</value> 
<text>1 min</text> 
</duration> 
<distance> 
<value>154</value> 
<text>0.1 mi</text> 
</distance> 
</element> 
</row> 
</DistanceMatrixResponse> 

Я пытаюсь использовать Python, чтобы сохранить этот XML из Интернета локально (эта часть будет завершена). После сохранения файла я хочу извлечь значение «длительность» (в данном случае 19) и значение «расстояние» (в данном случае - 154).

Я просто не могу понять, как читать и извлекать необходимую информацию из этого XML. Я пробовал работать с ElementTree и пытаюсь реализовать другие решения из stackoverflow, без везения. У меня около 3 часов, что должно быть быстрым процессом.

Вот мой код, как он сидит прямо сейчас:

import urllib2 
import xml.etree.ElementTree as ET 

## import XML and save it out 
url = "https://maps.googleapis.com/maps/api/distancematrix/xml?units=imperial&origins=35.827581,-86.394077&destinations=35.827398,-86.392381&key=mygooglemapsAPIkey" 
s = urllib2.urlopen(url) 
contents = s.read() 
file = open("export.xml", 'w') 
file.write(contents) 
file.close() 
## finish saving the XML 


element_tree = ET.parse("export.xml") 
root = element_tree.getroot() 
agreement = root.find("duration").text 
print agreement 


## open XML and save out travel time in seconds 
xmlfile = 'export.xml' 
element_tree = ET.parse(xmlfile) 
root = element_tree.getroot() 
agreement = root.findall("duration").text 
print agreement 

Текущее сообщение об ошибке: AttributeError: объект «Nonetype» не имеет атрибута «текст»

Я знаю код неполна, чтобы захватить как продолжительность и расстояние, но я просто пытаюсь получить что-то работающее в этот момент!

ответ

0

Просто используйте XPath queries:

duration = tree.find('.//duration/value').text 
distance = tree.find('.//distance/value').text 

Вот хороший учебник XPath: http://zvon.org/comp/r/tut-XPath_1.html.

+0

Это был ключ! Большое вам спасибо, я потратил слишком много времени, пытаясь сделать эту работу. – Jonathan

+0

@ Джонатан, я просто упростил свой код, нет необходимости использовать '.findall', если вы ожидаете только одного значения' duration' или 'distance' в вашем документе. – skovorodkin

+0

Да, это тоже хорошо. Выход из API-интерфейсов Map Maps Distance Matrix довольно прост, поэтому .findall() был излишним. Еще раз спасибо!! – Jonathan

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