Python — XML API ElementTree (не анализируется должным образом)

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 с использованием этого метода, спасибо.

попробуйте "root = etree.fromstring(response.content).getroottree()"

blackdrumb 30.05.2019 18:20

Вы просто хотите распечатать XML или извлечь информацию из дерева?

balderman 31.05.2019 12:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
394
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте этот код:

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 &lt;tessellate&gt; 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>

Спасибо за помощь, я получаю сообщение об ошибке не могу использовать строковый шаблон для байтового объекта

WillD 03.06.2019 16:07

Добавление этого в 9-ю строку устранило проблему xmlstring = re.sub(' xmlns = "[^"]+"', '', r.content.decode('utf-8'), count=1)

WillD 03.06.2019 16:08

Какую версию Python вы используете? (Я тестировал код под python 3.6)

balderman 03.06.2019 16:12

Я использую 3.7, ответ на запрос раньше тоже поступал как байтовый объект. Я проголосую за вас как за ответ, так как он дал мне 99% пути. Также обратите внимание, что ответом является kml для итерации координат, которые я использовал для элемента в root.getiterator("coordinates"): print (element.text)

WillD 03.06.2019 16:22

Другие вопросы по теме