Проблема:
У меня есть следующий фрагмент XML:
...snip...
<p class="p_cat_heading">DEFINITION</p>
<p class="p_numberedbullet"><span class="calibre10">This</span>, <span class="calibre10">these</span>. </p>
<p class="p_cat_heading">PRONUNCIATION </p>
..snip...
Мне нужно выполнить поиск по всему XML, найти заголовок с текстом DEFINITION
и распечатать соответствующие определения. Формат определений не согласован и может изменять атрибуты / элементы, поэтому единственный надежный способ захвата всего этого - читать до следующего элемента с атрибутом p_cat_heading
.
Сейчас я использую следующий код, чтобы найти все заголовки:
for heading in root.findall(".//*[@class='p_cat_heading']"):
if heading.text == "DEFINITION":
<WE FOUND THE CORRECT HEADER - TAKE ACTION HERE>
То, что я пробовал:
- Использование метода getnext lxml. Это получает следующий брат, который имеет атрибут "p_cat_heading", что не то, что я хочу.
- follow_sibling - предполагается, что lxml поддерживает это, но выдает «follow-sibling не найден в prefix-map»
Мое решение:
Я еще не закончил, но из-за того, что мой XML короткий, я просто собирался получить список всех элементов, итерировать до элемента с атрибутом DEFINITION, а затем до следующего элемента с атрибутом p_cat_heading. Это ужасное и уродливое решение, но я не могу найти чистую альтернативу.
Что я ищу:
Более Pythonic способ печати определения, которое "это, это" в нашем случае. Решение может использовать либо xpath, либо какую-то альтернативу Предпочтительны Python-нативные решения, но все подойдет.