如何用Python3提取混合文本/JSON字符串列表的文本内容?
用Python优雅提取混合结构列表中的纯文本
问题背景
我手头有一批剥离外层JSON后的文本语料,格式是混合了字符串和字典的列表,示例如下:
data = [ '“Ми підписали угоду, яка дозволяє громадянам України подорожувати без віз до Монголії. Це означає, що громадяни України можуть в’їжджати до Монголії без віз на 90 днів упродовж 180 днів” - ', { 'type': 'link', 'attributes': { 'href': 'https://www.facebook.com/UkraineMFA/posts/2498886686831903', 'target': '_blank', 'rel': None }, 'content': [ 'повідомляє сторінка МЗС у Facebook' ] }, ' із посиланям на посла України у Польщі Андрія Дещицю.' ]
列表里的元素要么是纯文本字符串,要么是带content字段的字典(content里是文本列表)。需要把所有文本内容提取出来,拼接成无格式的纯文本,最终效果如下:
“Ми підписали угоду, яка дозволяє громадянам України подорожувати без віз до Монголії. Це означає, що громадяни України можуть в’їжджати до Монголії без віз на 90 днів упродовж 180 днів” - повідомляє сторінка МЗС у Facebook із посиланям на посла України у Польщі Андрія Дещицю.
优雅实现方案
1. 基础循环法(直观好懂)
遍历列表里的每一项,判断类型后处理:字符串直接加入结果;字典就取出content里的所有文本拼接。代码简单直观,适合新手理解:
def extract_plain_text(data): result = [] for item in data: if isinstance(item, str): result.append(item) elif isinstance(item, dict) and 'content' in item: result.extend(item['content']) return ''.join(result) # 测试调用 data = [ '“Ми підписали угоду, яка дозволяє громадянам України подорожувати без віз до Монголії. Це означає, що громадяни України можуть в’їжджати до Монголії без віз на 90 днів упродовж 180 днів” - ', { 'type': 'link', 'attributes': { 'href': 'https://www.facebook.com/UkraineMFA/posts/2498886686831903', 'target': '_blank', 'rel': None }, 'content': [ 'повідомляє сторінка МЗС у Facebook' ] }, ' із посиланям на посла України у Польщі Андрія Дещицю.' ] print(extract_plain_text(data))
2. 生成器表达式法(简洁高效)
用生成器表达式替代循环,代码更紧凑,执行效率也不错,适合场景简单的情况:
def extract_plain_text(data): return ''.join( item if isinstance(item, str) else ''.join(item['content']) for item in data if isinstance(item, (str, dict)) and (isinstance(item, str) or 'content' in item) ) # 测试输出和上面一致
3. 递归处理法(支持嵌套场景)
如果你的语料里content字段还可能嵌套字典(比如多层嵌套的链接元素),用递归就能搞定所有嵌套情况,通用性更强:
def extract_plain_text(item): if isinstance(item, str): return item elif isinstance(item, dict) and 'content' in item: return ''.join(extract_plain_text(sub_item) for sub_item in item['content']) elif isinstance(item, list): return ''.join(extract_plain_text(sub_item) for sub_item in item) return '' # 测试输出一致
内容的提问来源于stack exchange,提问作者Sir Cornflakes
相关产品推荐
相关产品推荐

