在 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/