У меня есть XML, который я хочу повторить. Мне нужно найти предыдущий узел определенного (с тегом «текст» и атрибутом «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>
0
Anna 15 Апр 2020 в 18:33

1 ответ

Лучший ответ

Мне на 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

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

0
Darien Schettler 15 Апр 2020 в 15:49