Python用XPath提取Kanjidic2 XML的nanori等读音释义数据问题
实现代码
你可以直接基于当前遍历到的reading_meaning节点查询子节点,避免全局XPath路径写错导致匹配不到的问题,示例逻辑如下:
for i in character: if i.tag == 'reading_meaning': # 初始化存储结构 ja_on = {} # 存储音读 ja_kun = {} # 存储训读 nanori = {} # 存储名乘 meanings = {} # 按语言存储释义,key为语言代码,value为释义列表 # 处理rmgroup下的读音和释义 rmgroup = i.find('rmgroup') # 提取读音 readings = rmgroup.findall('reading') on_idx = 1 kun_idx = 1 for rd in readings: r_type = rd.get('r_type') if r_type == 'ja_on': ja_on[f'on_{on_idx}'] = rd.text on_idx += 1 elif r_type == 'ja_kun': ja_kun[f'kun_{kun_idx}'] = rd.text kun_idx += 1 # 提取多语言释义 mean_list = rmgroup.findall('meaning') for mean in mean_list: # 无m_lang属性的默认是英文释义 lang = mean.get('m_lang', 'en') if lang not in meanings: meanings[lang] = [] meanings[lang].append(mean.text) # 提取nanori nanori_list = i.findall('nanori') nan_idx = 1 for nan in nanori_list: nanori[f'nanori_{nan_idx}'] = nan.text nan_idx += 1
空字典问题排查
- 你之前的写法是每次都从根节点全局查询对应标签,容易因为XPath拼写错误、ID传值错误导致匹配不到节点,直接用当前遍历到的父节点查询子节点稳定性更高
- 如果你不需要带序号的key,可以直接用列表存储,调用
append()方法添加内容即可,更符合常规使用习惯 - 注意默认英文释义没有
m_lang属性,不要漏判这个场景导致英文释义无法存入字典
内容的提问来源于stack exchange,提问作者Juan Camilo Orjuela
相关产品推荐
相关产品推荐

