Python中如何将XML标签间的文本保存到变量中?
解决SAX解析XML时无法将文本保存到变量的问题
我明白你的困惑啦!用SAX解析XML的时候,直接在回调方法里return确实没法把文本存到变量里——因为SAX是事件驱动的,那些回调方法(比如characters())是由解析器自动触发执行的,return的值根本不会被外部代码捕获到。你需要换个思路:在自定义的Handler类里维护一个变量,用来收集解析过程中遇到的文本,解析完成后再从这个Handler实例里取出内容。
修正后的代码示例
下面是调整后的完整代码,能把你需要的文本正确存入变量:
from xml.sax import make_parser, handler class TextCollectorHandler(handler.ContentHandler): def __init__(self): super().__init__() self.collected_text = [] # 用列表收集文本片段,比直接拼接字符串更高效 def characters(self, content): # 过滤掉无意义的空白文本,只保留有效内容 cleaned_content = content.strip() if cleaned_content: self.collected_text.append(cleaned_content) # 你的XML内容(注意修正原代码里未闭合的标签) xml_content = '<text><p><s id="1">Some text <someothertag>some more text</someothertag></s></p></text>' # 初始化解析器和自定义Handler parser = make_parser() text_handler = TextCollectorHandler() parser.setContentHandler(text_handler) # 执行解析 parser.parseString(xml_content) # 将收集到的文本片段拼接成完整字符串,存入变量 extracted_text = ' '.join(text_handler.collected_text) print(extracted_text) # 输出: Some text some more text # 现在extracted_text就是你要的变量啦!
进阶:只收集特定标签内的文本
如果你的需求是只提取某几个特定标签(比如<s>标签)里的文本,可以在Handler里增加标签状态标记,精准控制收集范围:
class TargetTagHandler(handler.ContentHandler): def __init__(self): super().__init__() self.collected_text = [] self.in_target_tag = False # 标记是否处于目标标签内 def startElement(self, name, attrs): # 当进入<s>标签时,开启收集开关 if name == 's': self.in_target_tag = True def endElement(self, name): # 当离开<s>标签时,关闭收集开关 if name == 's': self.in_target_tag = False def characters(self, content): # 只有在目标标签内且内容非空白时,才收集文本 if self.in_target_tag and content.strip(): self.collected_text.append(content.strip()) # 使用这个Handler的方式和之前一致 parser = make_parser() target_handler = TargetTagHandler() parser.setContentHandler(target_handler) parser.parseString(xml_content) target_text = ' '.join(target_handler.collected_text) print(target_text) # 同样输出目标标签内的文本
核心思路就是:SAX解析是“边读边触发事件”,你不能指望从回调方法里return值,而是要在Handler内部把数据存起来,等解析完了再统一取出。
内容的提问来源于stack exchange,提问作者student
相关产品推荐
相关产品推荐

