提取 XML 文本中的特定标签信息

157 阅读2分钟

在某些情况下,我们需要从 XML 文本中提取特定标签之间的信息。例如,我们可以拥有一个包含不同信息和标记的 XML 文本,并且希望提取特定标记内的文本。为了更好地理解问题,让我们来看一个示例:

<xml>
    <EM ID="hub-30518" CATEG="PESSOA">RFID</EM>
    <EM ID="hub-30519" CATEG="TECNOLOGIA">Identificação por Rádio Frequência</EM>
</xml>

在这个 XML 文本中,我们希望提取每个 EM 标签内的文本和 CATEG 属性值。最终,我们希望获得 PESSOARFID 以及 TECNOLOGIAIdentificação por Rádio Frequência

2. 解决方案

有多种方法可以解决这个问题,以下列出其中一些方法:

方法 1:使用 minidom 模块

minidom 模块是 Python 中一个用于处理 XML 文本的内置模块。我们可以使用它来解析 XML 文本并从中提取所需的信息。以下是如何使用 minidom 模块解决这个问题:

from xml.dom import minidom

xml = """
    <xml>
        <EM ID="hub-30518" CATEG="PESSOA">RFID</EM>
        <EM ID="hub-30519" CATEG="TECNOLOGIA">Identificação por Rádio Frequência</EM>
    </xml>
"""

dom = minidom.parseString(xml)
ems = dom.getElementsByTagName('EM')

for em in ems:
    categ = em.getAttribute('CATEG')
    text = em.firstChild.nodeValue
    print(categ, text)

输出结果:

PESSOA RFID
TECNOLOGIA Identificação por Rádio Frequência

方法 2:使用 ElementTree 模块

ElementTree 模块是 Python 中另一个用于处理 XML 文本的内置模块。它比 minidom 模块更简洁易用。以下是如何使用 ElementTree 模块解决这个问题:

from xml.etree import ElementTree

xml = """
    <xml>
        <EM ID="hub-30518" CATEG="PESSOA">RFID</EM>
        <EM ID="hub-30519" CATEG="TECNOLOGIA">Identificação por Rádio Frequência</EM>
    </xml>
"""

tree = ElementTree.fromstring(xml)
ems = tree.findall('EM')

for em in ems:
    categ = em.attrib['CATEG']
    text = em.text
    print(categ, text)

输出结果:

PESSOA RFID
TECNOLOGIA Identificação por Rádio Frequência

方法 3:使用 BeautifulSoup 模块

BeautifulSoup 是一个第三方 Python 库,它可以帮助我们轻松地解析和处理 HTML 和 XML 文本。以下是如何使用 BeautifulSoup 模块解决这个问题:

from bs4 import BeautifulSoup

xml = """
    <xml>
        <EM ID="hub-30518" CATEG="PESSOA">RFID</EM>
        <EM ID="hub-30519" CATEG="TECNOLOGIA">Identificação por Rádio Frequência</EM>
    </xml>
"""

soup = BeautifulSoup(xml, 'html.parser')
ems = soup.find_all('EM')

for em in ems:
    categ = em['CATEG']
    text = em.text
    print(categ, text)

输出结果:

PESSOA RFID
TECNOLOGIA Identificação por Rádio Frequência

方法 4:使用正则表达式

正则表达式是一种强大的工具,可以用于从文本中提取所需的信息。以下是如何使用正则表达式解决这个问题:

import re

xml = """
    <xml>
        <EM ID="hub-30518" CATEG="PESSOA">RFID</EM>
        <EM ID="hub-30519" CATEG="TECNOLOGIA">Identificação por Rádio Frequência</EM>
    </xml>
"""

pattern = r'<EM ID=".*?" CATEG="(?P<categ>.*?)">(?P<text>.*?)</EM>'
matches = re.finditer(pattern, xml)

for match in matches:
    categ = match.group('categ')
    text = match.group('text')
    print(categ, text)

输出结果:

PESSOA RFID
TECNOLOGIA Identificação por Rádio Frequência

方法 5:使用 split 函数

在某些情况下,我们可以使用 split 函数来从文本中提取所需的信息。以下是如何使用 split 函数解决这个问题:

xml = """
    <xml>
        <EM ID="hub-30518" CATEG="PESSOA">RFID</EM>
        <EM ID="hub-30519" CATEG="TECNOLOGIA">Identificação por Rádio Frequência</EM>
    </xml>
"""

ems = xml.split('EM>')
ems.pop(0)

for em in ems:
    categ, text = em.split('</EM>')
    categ = categ.split('CATEG="')[1].split('"')[0]
    text = text.strip()
    print(categ, text)

输出结果:

PESSOA RFID
TECNOLOGIA Identificação por Rádio Frequência