python - XML 阅读器似乎忽略了标签层次结构

标签 python xml beautifulsoup

在 XML 文件中,我试图获取在标签层次结构的不同级别多次出现的标签的内容。我正在尝试获取标签最高级别出现的内容,但我的 XML 阅读器(Python 版 BeautifulSoup)一直给我错误的内容。

这是具体问题。这是 XML 文件的一部分(浓缩为我认为相关的部分):

<object>
    <name>person</name>
    <part>
        <name>head</name>
        <bndbox>
            <xmin>337</xmin>
            <ymin>2</ymin>
            <xmax>382</xmax>
            <ymax>66</ymax>
        </bndbox>
    </part>
    <bndbox>
        <xmin>334</xmin>
        <ymin>1</ymin>
        <xmax>436</xmax>
        <ymax>373</ymax>
    </bndbox>
</object>

我有兴趣获取 <bndbox> 的内容通过命令在此代码段的末尾标记

box = object.bndbox

但是如果我打印出 box ,我不断得到这个:

<bndbox>
    <xmin>337</xmin>
    <ymin>2</ymin>
    <xmax>382</xmax>
    <ymax>66</ymax>
</bndbox>

这对我来说毫无意义。我不断得到的上面的框比我要求的低一个层次,在 <part> 下。标签,所以我应该只能通过

访问这个框
object.part.bndbox

同时

object.bndbox

应该给我唯一一个直接在 object 下的框标记,这是上面代码段中的最后一个框。

最佳答案

@mjsqu 所述在 the comments :

BeautifulSoup returns the first tag matching that name, so object.bbox refers to the first bbox in the XML, regardless of position in the hierarchy.

所以,要获得第二个 <bndbox>标签,或者 <bndbox>这是 <object> 的直接子代标签,你可以使用 recursive=False作为参数。这将只查找当前标签的直接子标签。

xml = '''
<object>
    <name>person</name>
    <part>
        <name>head</name>
        <bndbox>
            <xmin>337</xmin>
            <ymin>2</ymin>
            <xmax>382</xmax>
            <ymax>66</ymax>
        </bndbox>
    </part>
    <bndbox>
        <xmin>334</xmin>
        <ymin>1</ymin>
        <xmax>436</xmax>
        <ymax>373</ymax>
    </bndbox>
</object>'''

soup = BeautifulSoup(xml, 'xml')
print(soup.object.find('bndbox', recursive=False))

输出:

<bndbox>
<xmin>334</xmin>
<ymin>1</ymin>
<xmax>436</xmax>
<ymax>373</ymax>
</bndbox>

关于python - XML 阅读器似乎忽略了标签层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49971317/

相关文章:

python - PyQt 不识别箭头键

python - 覆盖 python-social-auth 内置 url?

python - 将 hdf5 matlab 字符串加载到 Python 中

android - 关于android :foregroundInsidePadding的信息

python - XPath 使用 lxml 失败

python - MySQLdb - 检查行是否存在 Python

java - 错误的 ImageView 正在更新

python - 如何防止 BeautifulSoup4 在汤中添加额外的 <html><body> 标签?

javascript - 使用 BeautifulSoup 抓取跨度

python - 如何使用 BeautifulSoup4 获取 <br> 标签前的所有文本