XML-ответ не может быть легко преобразован в объект Element Tree.
Я пробовал анализировать как строку, а также находить и заменять значения, это становится очень грязным, синтаксический анализ XML должен быть проще, чем это?
import requests
from lxml import etree
response = requests.get(url = "http://www.yournavigation.org/api/1.0/gosmore.php?format=kml&flat=52.215676&flon=5.963946&tlat=52.2573&tlon=6.1799&v=motorcar&fast=1&layer=mapnik")
root = etree.fromstring(response.content)
for child in root:
print (child.tag, child.attrib)
print(etree.tostring(root, pretty_print=True))
Я ожидаю, что объект Element Tree будет напечатан в формате prettify, а мой Root будет иметь много дочерних элементов. Объект «Дерево» не печатается таким образом, а у корня, похоже, нет дочерних элементов.
Могу ли я собрать здесь информацию о передовой практике анализа XML с использованием этого метода, спасибо.
Вы просто хотите распечатать XML или извлечь информацию из дерева?
Попробуйте этот код:
import xml.etree.ElementTree as ET
import requests
import re
r = requests.get(
'http://www.yournavigation.org/api/1.0/gosmore.php?forat=kml&flat=52.215676&flon=5.963946&tlat=52.2573&tlon=6.1799&v=motorcar&fast=1&layer=mapnik')
if r.status_code == 200:
# remove namespace
xmlstring = re.sub(' xmlns = "[^"]+"', '', r.content, count=1)
root = ET.fromstring(xmlstring)
ET.dump(root)
выход
<kml>
<Document>
<name>KML Samples</name>
<open>1</open>
<distance>21.452372</distance>
<traveltime>1228</traveltime>
<description>To enable simple instructions add: 'instructions=1' as parameter to the URL</description>
<Folder>
<name>Paths</name>
<visibility>0</visibility>
<description>Examples of paths.</description>
<Placemark>
<name>Tessellated</name>
<visibility>0</visibility>
<description>If the <tessellate> tag has a value of 1, the line will contour to the underlying terrain</description>
<LineString>
<tessellate>1</tessellate>
<coordinates> 5.963585,52.215950
5.963585,52.215950
5.963563,52.215986
5.963552,52.216012
5.964570,52.216254
5.964680,52.216333
5.964812,52.216371
5.966120,52.216622
5.967970,52.217000
5.968272,52.217056
5.969040,52.216970
5.969243,52.216943
5.969853,52.216862
5.969980,52.216840
5.970410,52.216760
5.970430,52.216757
5.970608,52.216718
5.970875,52.216652
5.971517,52.216534
5.972517,52.216352
5.972689,52.216347
5.972828,52.216322
5.973490,52.216180
5.974320,52.216020
5.974858,52.215917
5.975508,52.215795
5.975618,52.215774
5.975806,52.215736
5.975964,52.215707
5.976454,52.215615
5.976790,52.215550
5.977030,52.215500
5.978012,52.215322
5.978128,52.215301
5.978297,52.215269
5.978550,52.215223
5.979900,52.214980
5.979972,52.214967
5.980610,52.214850
5.981604,52.214682
5.982088,52.214593
5.982319,52.214555
5.983603,52.214328
5.983800,52.214290
5.984046,52.214244
5.984611,52.214147
5.984766,52.214123
5.984979,52.214089
5.985825,52.213893
5.985988,52.213862
5.986167,52.213827
5.986373,52.213785
5.987057,52.213667
5.987258,52.213647
5.988991,52.213331
5.991815,52.212817
5.993959,52.212422
5.996034,52.212043
5.996967,52.211876
5.997648,52.211743
5.998927,52.211492
5.999520,52.211376
5.999731,52.211334
5.999916,52.211301
6.000084,52.211273
6.000583,52.211188
6.003432,52.210674
6.004653,52.210453
6.004780,52.210428
6.004768,52.210359
6.004796,52.210315
6.004844,52.210283
6.004888,52.210267
6.004979,52.210256
6.005070,52.210271
6.005135,52.210305
6.005173,52.210356
6.005279,52.210337
6.008708,52.209720
6.011155,52.209269
6.012734,52.208984
6.012875,52.208959
6.012863,52.208920
6.012867,52.208894
6.012891,52.208857
6.012923,52.208833
6.012978,52.208812
6.013050,52.208803
6.013133,52.208814
6.013185,52.208838
6.013344,52.208817
6.013912,52.208709
6.014164,52.208648
6.014589,52.208512
6.014934,52.208433
6.015404,52.208346
6.018004,52.207885
6.019191,52.207672
6.019602,52.207601
6.020681,52.207393
...
</coordinates>
</LineString>
</Placemark>
</Folder>
</Document>
</kml>
Спасибо за помощь, я получаю сообщение об ошибке не могу использовать строковый шаблон для байтового объекта
Добавление этого в 9-ю строку устранило проблему xmlstring = re.sub(' xmlns = "[^"]+"', '', r.content.decode('utf-8'), count=1)
Какую версию Python вы используете? (Я тестировал код под python 3.6)
Я использую 3.7, ответ на запрос раньше тоже поступал как байтовый объект. Я проголосую за вас как за ответ, так как он дал мне 99% пути. Также обратите внимание, что ответом является kml для итерации координат, которые я использовал для элемента в root.getiterator("coordinates"): print (element.text)
попробуйте "root = etree.fromstring(response.content).getroottree()"