В Питоне я, в общем-то, новичок, но полюбил его сразу, и считаю его почти идеальным инструментом для решения моей задачи.
Пишу привод для торговли на бирже, и сейчас разбираю биржевые данные, которые приезжают в формате “почти” XML (без заголовка)
Данные примерно такие:
<securities><security secid="2326" active="true"><seccode>LK13500BE3</seccode><shortname>LKOH-6.13M140513CA 13500</shortname><decimals>0</decimals><market>4</market><sectype>OPT</sectype><opmask usecredit="no" bymarket="no" nosplit="no" immorcancel="no" cancelbalance="yes"/><minstep>1</minstep><lotsize>1</lotsize><point_cost>100</point_cost></security><security secid="2327" active="true"><seccode>RU000A0JTFZ1</seccode><shortname>СтаврКрай1</shortname><decimals>2</decimals><market>1</market><sectype>BOND</sectype><opmask usecredit="yes" bymarket="no" nosplit="yes" immorcancel="yes" cancelbalance="yes"/><minstep>0.01</minstep><lotsize>1</lotsize><point_cost>10</point_cost></security></securities>
<quotations><quotation secid="907"><accruedintvalue>0.00</accruedintvalue><closeprice>6510</closeprice><volatility>22.06</volatility><theoreticalprice>6790</theoreticalprice><buydeposit>9397.46</buydeposit><selldeposit>5328.24</selldeposit></quotation></quotations>
Код такой:
#coding=utf8 import sqlite3 import xml.etree.cElementTree as ET ## now parse encs = '<?xml version="1.0" encoding="UTF-8"?>' mybase = sqlite3.connect('stock.db') sqlres = mybase.execute('SELECT [recv].[rawtext] FROM [recv] ORDER BY [time] ASC') # LIMIT 10 for row in sqlres: sqlanswer = encs + str(row[0]) try: root = ET.fromstring(sqlanswer) except: print('Error parsing XML: %s' % sqlanswer) # если где-то вдруг косяк pass for elem in root.iter(): print(' TAG -> ' + elem.tag, end='') if elem.text: print(' TEXT = ' + elem.text, end='') # TEXT for attr in elem.attrib: print(' ATTR ' + attr + " = " + elem.attrib[attr])
Получаю вывод:
TAG -> seccode TEXT = TATNP TAG -> shortname TEXT = Татнфт 3ап TAG -> decimals TEXT = 2 TAG -> market TEXT = 1 TAG -> sectype TEXT = SHARE TAG -> opmask ATTR cancelbalance = yes
ATTR bymarket = yes
ATTR usecredit = yes
ATTR nosplit = yes
ATTR immorcancel = yes
TAG -> minstep TEXT = 0.01 TAG -> lotsize TEXT = 10 TAG -> point_cost TEXT = 1 TAG -> security ATTR active = true
ATTR secid = 29
TAG -> quotations TAG -> quotation ATTR secid = 907
TAG -> accruedintvalue TEXT = 0.00 TAG -> closeprice TEXT = 6510 TAG -> volatility TEXT = 22.06 TAG -> theoreticalprice TEXT = 6790 TAG -> buydeposit TEXT = 9397.46 TAG -> selldeposit TEXT = 5328.24
Есть целый набор возможных тэгов, в данном случае я привожу только <seccode>, который описывает список торгуемых бумаг и <quotations> - цены.
Я упёрся в то, что 1) описания приходят пачками, 2) не знаю, как же их ПРАВИЛЬНО вернуть из парсера, чтобы затем заполнить tuples для дальнейшего использования.
То ли список списков тут нужен, то ли…. неясно, в общем. Подскажите?!
Как потом разбирать, тоже вопрос. if TAG == ‘seccode’ then…. и так 55 линий? Глупо.
Прошу совета.