Python анализирует странный корень - TTML (XML) с ElementTree или lxml

Вот укороченный пример TTML-файла, который, на мой взгляд, выглядит как специально отформатированный XML-файл:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:nttm="http://www.netflix.com/ns/ttml#metadata" xmlns:ttp="http://www.w3.org/ns/ttml#parameter" xmlns:tts="http://www.w3.org/ns/ttml#styling" ttp:timeBase="media" ttp:version="2" tts:extent="1280px 720px" xml:lang="zh-Hans">
    <head>
        <metadata nttm:movieId="81170257" nttm:packageId="1618461" nttm:schemaVersion="0" nttm:textType="SUBS" nttm:uuid="9c50201b-f11e-4665-9944-3bda07268f29"/>
    </head>
    <body>
        <div begin="00:00:06.833" end="00:00:09.958" tts:extent="479px 51px" tts:origin="407px 597px">
            <image src="1.png"/>
        </div>
        <div begin="00:00:26.083" end="00:00:29.250" tts:extent="431px 46px" tts:origin="431px 602px">
            <image src="2.png"/>
        </div>
        <div begin="00:14:27.125" end="00:14:27.958" tts:extent="161px 46px" tts:origin="566px 602px">
            <image src="165.png"/>
        </div>
    </body> 
</tt>

Вот код, который я запускаю:

import lxml.etree as ET
tree = ET.parse("sample_ttml2.xml")
root = tree.getroot()
print(root.tag)
for div in root.iterfind(".//div"):
    print(div)
for div in root.iterfind("div"):
    print(div)

Это выводит:

{http://www.w3.org/ns/ttml}tt

Чего я ожидал, так это тега tt без этого пространства имен. Когда я пытаюсь выполнить итерацию, я ничего не получаю, даже при использовании XPath. Я думаю, что есть некоторые проблемы с его разбором, но я понятия не имею, почему. Придется ли мне писать свой парсер?


person AlpacaJones    schedule 06.05.2020    source источник
comment
Элементы имеют пространство имен; атрибут xmlns="http://www.w3.org/ns/ttml" сообщает синтаксическому анализатору, что элемент tt принадлежит пространству имен http://www.w3.org/ns/ttml. Объявления пространств имен применяются к текущему элементу и всем дочерним элементам в дереве, если у них нет собственного объявления пространства имен. См. документацию LXML по пространствам имен и XPath.   -  person Martijn Pieters    schedule 06.05.2020
comment
Я нашел вам канонический дубликат для этой проблемы, посмотрите ответы на как мне использовать пустые пространства имен в запросе lxml xpath?   -  person Martijn Pieters    schedule 06.05.2020