Использование pyKML для анализа документа KML

Я использую модуль pyKML для извлечения координат из заданного файла KML.

Мой код Python выглядит следующим образом:

from pykml import parser
fileobject = parser.fromstring(open('MapSource.kml', 'r').read())
root = parser.parse(fileobject).getroot()
print(xml.Document.Placemark.Point.coordinates)

Однако при запуске этого я получаю следующую ошибку:

ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

В поисках решений я наткнулся на это решение http://twigstechtips.blogspot.in/2013/06/python-lxml-strings-with-encoding.html, откуда я пробовал это (я не уверен, что это правильный метод):

from pykml import parser
from lxml import etree
from os import path
kml_file = open('MapSource.kml', 'r')
parser = etree.XMLParser(recover=True)
xml = etree.fromstring(kml_file, parser)
print(xml.Document.Placemark.Point.coordinates)

Это дает мне ValueError: can only parse strings. Как мне правильно разобрать KML и получить координаты в этой структуре?


person Newtt    schedule 27.09.2014    source источник
comment
Проблема может быть связана с конкретным файлом KML, который вы пытаетесь проанализировать. Можете ли вы опубликовать файл KML в общедоступном месте, чтобы другие могли попытаться воспроизвести проблему, с которой вы столкнулись?   -  person Tyler Erickson    schedule 03.10.2014
comment
@TylerErickson, вот: raw.githubusercontent.com/SiddharthMantri/TFTSEnhance/master/   -  person Newtt    schedule 03.10.2014


Ответы (1)


В приведенном выше примере root = parser.parse(fileobject).getroot() вызывает parse() для содержимого файла в виде строки, возвращаемой функцией fromstring() из предыдущей строки.

Существует два метода анализа файла KML с помощью pyKML:

1: Использование parse.parse() для разбора файла.

from pykml import parser
with open('MapSource.kml', 'r') as f:
  root = parser.parse(f).getroot()
print(root.Document.Placemark.Point.coordinates)

2: Использование parse.parsestring() для разбора содержимого строки.

from pykml import parser
with open('MapSource.kml', 'rb') as f:
  s = f.read()
root = parser.fromstring(s)
print(root.Document.Placemark.Point.coordinates)

Метод № 2 может дать сбой, если файл KML имеет заголовок пролога XML в качестве первой строки с кодировкой, отличной от UTF8, и попытаться прочитать файл с «r» в качестве текста вместо «rb» для двоичного формата.

Обратите внимание, что синтаксический анализ может завершиться ошибкой, если в документе KML неправильно указана кодировка. Кодировка ISO-8859-1 используется в приведенном ниже примере из-за международных и графических символов в имени и описании. Отсутствие кодировки или использование UTF-8 сделает его недопустимым XML-файлом.

<?xml version="1.0" encoding="ISO-8859-1"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
  <Placemark>
    <name>Río Grande</name> 
    <description>
      Location: 18° 22′ 49″ N, 65° 49′ 53″ W
    </description>
    ...
</kml>
person JasonM1    schedule 27.08.2020