在某些情况下,我们需要从 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 属性值。最终,我们希望获得 PESSOA 和 RFID 以及 TECNOLOGIA 和 Identificaçã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