Вот укороченный пример 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. Я думаю, что есть некоторые проблемы с его разбором, но я понятия не имею, почему. Придется ли мне писать свой парсер?
xmlns="http://www.w3.org/ns/ttml"
сообщает синтаксическому анализатору, что элементtt
принадлежит пространству именhttp://www.w3.org/ns/ttml
. Объявления пространств имен применяются к текущему элементу и всем дочерним элементам в дереве, если у них нет собственного объявления пространства имен. См. документацию LXML по пространствам имен и XPath. - person Martijn Pieters   schedule 06.05.2020