You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:05:23