使用Python SAX解析器提取XML指定标签文本时如何过滤空白字符?
解决SAX解析XML时提取有效文本的问题
你遇到的问题其实是SAX解析器的特性导致的——SAX的characters()方法会触发所有文本节点,包括XML里用来格式化的空格、换行符这些空白内容,而你的代码没有区分这些空白和真正需要的标签文本,所以会输出一堆空的或者带空格的内容。
先说说你代码里的几个小问题:
- 每次调用
startElement()时都会把self.tag设为当前标签,比如解析<song>的时候,self.tag就变成了song,不过这不是核心问题; - 你在
characters()里直接判断当前标签是artist就打印内容,但<artist>标签前后的缩进空格、换行符都会被characters()捕获到,这些空白内容也会被打印出来; - 另外,SAX可能会把同一个标签内的文本分成多次
characters()调用(虽然这个例子里不会,但最好考虑到),直接打印会导致内容拆分。
修正后的代码
我们可以调整思路,维护一个“是否处于目标标签内”的状态,然后积累标签内的文本,最后在标签结束时处理并输出有效内容:
#!/usr/bin/env python3 import xml.sax class MyHandler(xml.sax.ContentHandler): def __init__(self): xml.sax.ContentHandler.__init__(self) self.in_artist = False # 标记是否在<artist>标签内 self.artist_content = "" # 用来积累<artist>的文本内容 def startElement(self, name, attrs): if name == "artist": self.in_artist = True # 进入<artist>标签,开启状态 self.artist_content = "" # 重置内容容器 def characters(self, content): if self.in_artist: self.artist_content += content # 只在目标标签内积累文本 def endElement(self, name): if name == "artist": self.in_artist = False # 离开<artist>标签,关闭状态 # 去除前后空白,只输出有效内容 cleaned_content = self.artist_content.strip() if cleaned_content: # 确保内容非空再打印 print(f'[{cleaned_content}]') if __name__=='__main__': parser = xml.sax.make_parser() Handler = MyHandler() parser.setContentHandler(Handler) parser.parse("songs.xml")
代码解释
self.in_artist:用布尔值标记当前是否处于<artist>标签范围内,避免捕获其他标签的空白内容;self.artist_content:用来积累<artist>标签内的所有文本,不管characters()调用多少次,都能把内容拼起来;- 在
endElement()里处理文本:用strip()去除前后的空格、换行符等空白,再判断内容非空后打印,这样就只会输出真正的艺术家名字了。
运行结果
执行这段代码后,你会得到干净的输出:
[Ariana Grande] [Taylor Swift] [Melanie Martinez]
这个方案在Python2和Python3里都能正常工作,完美解决空白内容的问题~
内容的提问来源于stack exchange,提问作者NetHead
相关产品推荐
相关产品推荐

