Beautiful组处理XML中的重复节点



我正试图应用Beautifulsoup来解析XML响应,以仅列出代码值,但当父节点与子节点的名称相同时,我遇到了一个问题。例如;代码";用作父节点名称,也用作子节点。

使用的XML:

<codes>
<code>
<id>9601</id>
<description>Description 1</description>
<code>C1</code>
</code>
<code>
<id>9602</id>
<description>Description 2</description>
<code>C2</code>
</code>
<code>
<id>9603</id>
<description>Description 3</description>
<code>C3</code>
</code>
<code>
<id>9604</id>
<description>Description 4</description>
<code>C4</code>
</code>
<code>
<id>9605</id>
<description>Description 5</description>
<code>C5</code>
</code>
</codes>

简单的python代码:

from bs4 import BeautifulSoup
infile = open("response.xml","r")
contents = infile.read()
soup = BeautifulSoup(contents,'xml')
codes = soup.find_all('code')
for code in codes:
print(code.get_text())

输出为:

9601
Description 1
C1
C1
9602
Description 2
C2
C2
9603
Description 3
C3
C3
9604
Description 4
C4
C4
9605
Description 5
C5
C5

我想要的输出是:

C1
C2
C3
C4
C5

处理这些情况的最佳方法是什么?

您可以尝试下面的代码-它检查代码中是否有文本注意代码使用的是核心python库,而不是外部库。

import xml.etree.ElementTree as ET
xml = '''<codes>
<code>
<id>9601</id>
<description>Description 1</description>
<code>C1</code>
</code>
<code>
<id>9602</id>
<description>Description 2</description>
<code>C2</code>
</code>
<code>
<id>9603</id>
<description>Description 3</description>
<code>C3</code>
</code>
<code>
<id>9604</id>
<description>Description 4</description>
<code>C4</code>
</code>
<code>
<id>9605</id>
<description>Description 5</description>
<code>C5</code>
</code>
</codes>'''
root = ET.fromstring(xml)
for code in root.findall('.//code'):
txt = code.text.strip()
if txt:
print(code.text)

输出

C1
C2
C3
C4
C5

如果你想使用BeautifulSoup,那么你可以找到;id";元素,并引用父项以访问每个记录的所有元素。否则,最简单的方法是使用Python中的核心XML API来迭代顶级代码元素。

soup = BeautifulSoup(contents, 'xml')
elts = soup.find_all('id')
for elt in elts:
print(elt.parent.find('code', recursive=False).text)

输出:

C1
C2
C3
C4
C5

最新更新