如何按episodeID对示例XML中的剧集排序并解决现有代码报错
问题原因分析
你的代码存在3个核心错误,共同触发了本次报错:
- sorted的key参数使用错误:你直接调用了
get_episode_id(series_container),而key需要接收一个可调用对象,排序时会自动把每个待排序的元素作为参数传入这个函数 - 节点查找路径错误:你直接在
seriesItems父节点下查找episodeID,但episodeID是seriesItem子节点的下级节点,找不到节点就会返回None,调用.text属性就触发了AttributeError - 自定义函数缺少return语句:
get_episode_id没有写return语句,就算没有路径错误也只会返回None,无法作为排序依据
修复后的完整代码
import xml.etree.ElementTree as ET def get_episode_id(series_item): # 入参为单个seriesItem节点,返回其下episodeID的文本值 return series_item.find("episodeID").text tree = ET.parse("question.xml") series_containers = tree.findall(".//series_meta_data/seriesItems") for series_container in series_containers: # key直接传入函数对象,sorted会自动把每个seriesItem作为参数传入 series_container[:] = sorted(series_container, key=get_episode_id) # 写入时指定编码避免乱码,保留xml声明更规范 tree.write("new.xml", encoding="utf-8", xml_declaration=True)
你也可以用lambda表达式简化写法,不需要单独定义函数:
for series_container in series_containers: series_container[:] = sorted(series_container, key=lambda x: x.find("episodeID").text)
S01E01这类季集编号的字符串本身字典序就和季、集的正序规则一致,直接排序即可得到你需要的结果。
内容的提问来源于stack exchange,提问作者Harish
相关产品推荐
相关产品推荐

