Имя и размер семейства шрифтов указаны не в элементах <text>
, а в родительских группах <g>
. Необходимо соблюдать осторожность, поскольку несколько <g>
элементов могут казаться вложенными друг в друга.
Вы можете найти все <g>
элементы с помощью find_all
и временно сохранить параметры шрифта, но если вы попытаетесь это сделать чтобы сначала найти <g>
, а затем <text>
s, вы скоро заметите, что он не может правильно обрабатывать вложенные группы. Каждое вхождение <g>
будет инициировать поиск его содержащихся элементов <text>
, и поэтому, если есть набор вложенных
<g <em>group parameters</em>>
<g <em>text parameters</em>>
<text><em>your text</em></text>
</g>
</g>
, он сообщит обо всех элементах <text>
дважды : один раз для каждого (вложенного или нет) <g>
.
Таким образом, лучший способ - перебирать весь файл XML и сохранять информацию о шрифте как и когда Вы идете по нему.
root = ET.fromstring(example_svg)
font = None
font_size = None
for elem in root.iter():
if elem.tag == '{http://www.w3.org/2000/svg}g':
item = elem.get('font-family')
if item is not None:
font = item
item = elem.get('font-size')
if item is not None:
font_size = item
elif elem.tag == '{http://www.w3.org/2000/svg}text':
symbol = elem.text
y_coord = elem.get('y')
x_coord = elem.get('x')
print (symbol, y_coord, x_coord, font, font_size)
(Обратите внимание, что iter()
требуется полное пространство имен SVG, добавленное к каждому элементу.)
Результат:
3 11.168 45.874 MathFont 13.5
? 11.168 52.532 MathFont 13.5
4 28.382 50.758 MathFont 13.5
3 6.327 60.453 MathFont 9.45