Как обрабатывать XML в Пайтоне: 5 возможных альтернатив: и все не удаются?

Какие возможности обрабатывать документ XML существуют в Пайтоне? Я предлагаю им пересматривать наиболее отмеченные в настоящее время через документы XML, что они отказываются быть обвиняемыми. Давайте видеть:

Я возьму как шрифт XML шрифт этой страница:

Теннисные матчи

Что позволяет нам консультировать базу данных и в зависимости от параметров, которые применяются к унифицированному указателю ресурса, он возвращает нам файлы XML с попросившей информацией; в этом случае, у нас есть список спортивных событий:

introducir la descripción de la imagen aquí

Для каждого события (<event></event>) у нас есть, как минимум, один <id>, имя (<name>), и хронологическая информация, которая описывает Ваше начало (<start>).

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

Существуют большие и различные возможности манипулировать документом XML, но чтобы не увеличивать нас без необходимости, я соглашусь с тем, чтобы смочь связывать каждое событие с Вашей идентификацией и с часом начала; а именно, конечный результат мог бы быть словарем Пайтона, как этот:

dic_eventos = {1076553300890015:{'name':'Manuel Guinard vs Evgeny Donskoy',
                                 'start':datetime.strptime('2019-03-27T10:23:00.000Z', '%Y-%m-%dT%H:%M:%S.000Z')},
               1075839532180015:{'name':'Jurgen Zopp vs Mikael Torpegaard',
                                 'start':datetime.strptime('2019-03-27T10:40:00.000Z', '%Y-%m-%dT%H:%M:%S.000Z')},
               ....}

Но проблема состоит в том, что даже мы не прибываем в parsear документ XML; а именно, мы не можем действовать с причиной не можем превращать это в объекты Пайтон никакого типа.

Процесс загружения документа XML - тривиальный:

import requests
print(requests.get('https://www.matchbook.com/edge/rest/events?language=en&currency=GBP&price-mode=aggregated&exchange-type=back-lay&odds-type=DECIMAL&price-depth=3&price-order=price%20desc&include-event-participants=true&offset=0&per-page=100&market-states=open,suspended,closed&runner-states=open,suspended,closed&tag-url-names=tennis').text)

Получается сначала объект Response и после, применяя метод .text, контент XML в плоском тексте (str).

Далее я представляю им 5 возможностей обработки этих документов, которые я использовал, и мотивы прекращения каждой из них.

Requests_XML+XPath:

Страница автора

Примеры использования XPath

Использованный код:

from requests_xml import XMLSession

session = XMLSession()

maio = session.get('https://www.matchbook.com/edge/rest/events?language=en&currency=GBP&price-mode=aggregated&exchange-type=back-lay&odds-type=DECIMAL&price-depth=3&price-order=price%20desc&include-event-participants=true&offset=0&per-page=100&market-states=open,suspended,closed&runner-states=open,suspended,closed&tag-url-names=tennis')

eventos = maio.xml.xpath('//event')

Произведенное исключение:

Traceback (most recent call last):
  File "C:\Users\usuario\maio.py", line 37, in <module>
    event = maio.xml.xpath('//event')
  File "C:\Users\usuario\AppData\Local\Programs\Python\Python36\lib\site-packages\requests_xml.py", line 224, in xpath
    selected = self.lxml.xpath(selector)
  File "C:\Users\usuario\AppData\Local\Programs\Python\Python36\lib\site-packages\requests_xml.py", line 120, in lxml
    self._lxml = etree.fromstring(self.raw_xml)
  File "src\lxml\etree.pyx", line 3222, in lxml.etree.fromstring
  File "src\lxml\parser.pxi", line 1877, in lxml.etree._parseMemoryDocument
  File "src\lxml\parser.pxi", line 1765, in lxml.etree._parseDoc
  File "src\lxml\parser.pxi", line 1127, in lxml.etree._BaseParser._parseDoc
  File "src\lxml\parser.pxi", line 601, in lxml.etree._ParserContext._handleParseResultDoc
  File "src\lxml\parser.pxi", line 711, in lxml.etree._handleParseResult
  File "src\lxml\parser.pxi", line 640, in lxml.etree._raiseParseError
  File "<string>", line 1
lxml.etree.XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1

Beautifulsoup+lxml:

Страница автора

Использованный код:

import requests
from bs4 import BeautifulSoup

muno = requests.get("https://www.matchbook.com/edge/rest/events?language=en&currency=GBP&price-mode=aggregated&exchange-type=back-lay&odds-type=DECIMAL&price-depth=3&price-order=price%20desc&include-event-participants=true&offset=0&per-page=100&market-states=open,suspended,closed&runner-states=open,suspended,closed&tag-url-names=tennis")

maio = BeautifulSoup(muno.text, "xml")

print(maio)

Результат:

<?xml version="1.0" encoding="utf-8"?>

Что не подает нас, потому что мы не можем возвращать информацию о событиях, которая была тем, что мы искали.

XML.ElementTree:

Вопрос SO-ES, на котором я основываюсь

Использованный код:

import urllib.request
import xml.etree.ElementTree as ET

url = "https://www.matchbook.com/edge/rest/events?language=en&currency=GBP&price-mode=aggregated&exchange-type=back-lay&odds-type=DECIMAL&price-depth=3&price-order=price%20desc&include-event-participants=true&offset=0&per-page=100&market-states=open,suspended,closed&runner-states=open,suspended,closed&tag-url-names=tennis"
uh = urllib.request.urlopen(url)
data = uh.read()
commentinfo = ET.fromstring(data)

Произведенное исключение:

Traceback (most recent call last):
  File "C:/Users/usuario/maio.py", line 48, in <module>
    commentinfo = ET.fromstring(data)
  File "C:\Users\usuario\AppData\Local\Programs\Python\Python36\lib\xml\etree\ElementTree.py", line 1314, in XML
    parser.feed(text)
  File "<string>", line None
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0

Eval ():

Так как у нас есть объект str что является 'почти' словарем в Пайтоне, было бы возможно ставить вопрос о возможности это превращать действительно в словарь:

import requests

maio = requests.get("https://www.matchbook.com/edge/rest/events?language=en&currency=GBP&price-mode=aggregated&exchange-type=back-lay&odds-type=DECIMAL&price-depth=3&price-order=price%20desc&include-event-participants=true&offset=0&per-page=100&market-states=open,suspended,closed&runner-states=open,suspended,closed&tag-url-names=mlb&in-running-flag=false")

print((eval(maio.text)))

Но нет, к несчастью также не возможно:

Traceback (most recent call last):
  File "C:/Users/usuario/maio.py", line 56, in <module>
    print((eval(maio.text)))
  File "<string>", line 1, in <module>
NameError: name 'false' is not defined

XMLtodict:

Вопрос SO-ES, на котором я основываюсь

Использованный код:

import urllib.request
import xmltodict

url = "https://www.matchbook.com/edge/rest/events?language=en&currency=GBP&price-mode=aggregated&exchange-type=back-lay&odds-type=DECIMAL&price-depth=3&price-order=price%20desc&include-event-participants=true&offset=0&per-page=100&market-states=open,suspended,closed&runner-states=open,suspended,closed&tag-url-names=tennis"
data = urllib.request.urlopen(url)
parsed_data = xmltodict.parse(data.read())

Произведенное исключение:

Traceback (most recent call last):
  File "C:/Users/usuario/maio.py", line 36, in <module>
    parsed_data = xmltodict.parse(data.read())
  File "C:\Users\usuario\AppData\Local\Programs\Python\Python36\lib\site-packages\xmltodict.py", line 327, in parse
    parser.Parse(xml_input, True)
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 0

После этого всего путь crucis, они поймут, что мне казался как минимум подвиг обработка документов XML в Пайтоне. Но я не думаю, что с этим он остался доказанным, что невозможно осуществлять это; конечно, что возможно. И конечно, что будут многообразные детали, которые будут происходить незамеченные для меня. Они кажутся Вам очевидными?

7
задан 27.03.2019, 16:08
0 ответов