Как получить второго предшествующего брата в XML в Python? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть XML Я хочу повторить. Мне нужно найти предыдущий узел указанного c (с тегом "текст" и атрибутом "bbox"). Проблема в том, что я хочу указать, если тег не имеет атрибута "bbox", чтобы не заботиться об этом и получить элемент раньше. Но я понятия не имею, как это сделать. Вот код:

 import lxml.etree as etree

from lxml.builder import E

parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse('fe3.xml', parser)
root = tree.getroot()

for x in tree.xpath('//text'):
        bb = x.attrib.get('bbox')
        if bb is not None:
            bb = bb.split(',')
        print('This: ', bb)
        xPrev = x.getprevious()
        bb = None
        if xPrev is not None:
            bb = xPrev.attrib.get('bbox')
            if bb is not None:
                bb = bb.split(',')
        if bb is not None:
            print('  Previous: ', bb)
        else:
            xx = bb.getprevious()
            print(xx, '  No previous bbox')

Для ясности, мой XML структурирован так (на самом деле он длиннее):

<?xml version="1.0" encoding="utf-8"?>
<pages>
    <page id="1" bbox="0.000,0.000,462.047,680.315" rotate="0">
        <textbox id="0" bbox="179.739,592.028,261.007,604.510">
            <textline bbox="179.739,592.028,261.007,604.510">
                <text font="NUMPTY+ImprintMTnum"  bbox="191.745,592.218,199.339,603.578" ncolour="0" size="12.482">C</text>
                <text font="NUMPTY+ImprintMTnum-it"  bbox="192.745,592.218,199.339,603.578" ncolour="0" size="12.333">A</text>
                <text font="NUMPTY+ImprintMTnum-it"  bbox="193.745,592.218,199.339,603.578" ncolour="0" size="12.333">P</text>
                <text font="NUMPTY+ImprintMTnum-it"  bbox="191.745,592.218,199.339,603.578" ncolour="0" size="12.333">I</text>
                <text font="NUMPTY+ImprintMTnum"  bbox="191.745,592.218,199.339,603.578" ncolour="0" size="12.482">T</text>
                <text font="NUMPTY+ImprintMTnum"  bbox="191.745,592.218,199.339,603.578" ncolour="0" size="12.482">O</text>
                <text font="NUMPTY+ImprintMTnum"  bbox="191.745,592.218,199.339,603.578" ncolour="0" size="12.482">L</text>
                <text font="NUMPTY+ImprintMTnum"  bbox="191.745,592.218,199.339,603.578" ncolour="0" size="12.482">O</text>
                <text></text>
                <text font="NUMPTY+ImprintMTnum"  bbox="191.745,592.218,199.339,603.578" ncolour="0" size="12.482">I</text>
                <text font="NUMPTY+ImprintMTnum"  bbox="191.745,592.218,199.339,603.578" ncolour="0" size="12.482">I</text>
                <text font="NUMPTY+ImprintMTnum"  bbox="191.745,592.218,199.339,603.578" ncolour="0" size="12.482">I</text>
                <text></text>
            </textline>
        </textbox>
    </page>
</pages>

1 Ответ

0 голосов
/ 15 апреля 2020

Мне неясно на 100%, чего вы пытаетесь достичь. При этом.

Поскольку вы просматриваете узлы bbox, вы можете просто добавить переменную и сохранить внутри bbox «предыдущий узел».

Вот код, который я бы использовал. .. если я правильно понял, чего вы хотите достичь


x_prev = None
for x in tree.xpath('//text'):
        bb = x.attrib.get('bbox')
        if bb is not None:
            bb = bb.split(',')
        print('This: ', bb)

        if x_prev is not None:
            print('  Previous: ', x_prev)
        else:
            print('  No previous bbox')

        # Store this bounding box for the next loop (to be used as x_prev)
        x_prev = bb

Для ясности этот код заменит весь ваш l oop

...