【问题标题】:How to get second preceding sibling in XML in Python?如何在 Python 中获取 XML 中的第二个前面的兄弟?
【发布时间】:2020-04-15 15:33:20
【问题描述】:

我有一个要迭代的 XML。我需要找到特定节点的前一个节点(带有标签“text”和属性“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>

【问题讨论】:

    标签: python xml xpath tags lxml


    【解决方案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
    

    为清楚起见,此代码将替换您的整个循环

    【讨论】:

    • 谢谢,但如果我打印 bb[0] 和 x_prev[0] 它是同一个数字...
    • 在我提供的代码中,您正在对每个节点进行采样。您正在打印当前节点和前一个节点。如果当前节点和前一个节点具有相同的第一项 bb[0],则它将是相同的数字。您能否运行此代码并共享部分 XML 的输出,以便我判断可能发生的情况?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    相关资源
    最近更新 更多