Какие возможности обрабатывать документ XML существуют в Пайтоне? Я предлагаю им пересматривать наиболее отмеченные в настоящее время через документы XML, что они отказываются быть обвиняемыми. Давайте видеть:
Я возьму как шрифт XML шрифт этой страница:
Что позволяет нам консультировать базу данных и в зависимости от параметров, которые применяются к унифицированному указателю ресурса, он возвращает нам файлы XML с попросившей информацией; в этом случае, у нас есть список спортивных событий:
Для каждого события (<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¤cy=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:
Использованный код:
from requests_xml import XMLSession
session = XMLSession()
maio = session.get('https://www.matchbook.com/edge/rest/events?language=en¤cy=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¤cy=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¤cy=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¤cy=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¤cy=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 в Пайтоне. Но я не думаю, что с этим он остался доказанным, что невозможно осуществлять это; конечно, что возможно. И конечно, что будут многообразные детали, которые будут происходить незамеченные для меня. Они кажутся Вам очевидными?