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

Selenium如何按原顺序提取WhatsApp消息内混合的文本与emoji内容

按原始顺序提取WhatsApp消息内容的实现方案

问题原因

你当前的代码分别独立抓取普通文本和emoji元素,没有遵循DOM节点的原始排布顺序,因此会出现所有文本在前、所有emoji在后的错位问题。

核心实现思路

直接遍历消息容器内部的所有子节点(包含文本节点、emoji元素节点),按节点的原始先后顺序分别处理:

  • 遇到emoji的img标签,取alt属性存储的表情字符
  • 遇到普通文本节点,取文本内容后按需清理多余的引号、空格即可

可直接运行的代码

chats = driver.find_elements_by_class_name("message-in")
for chat in chats:
    messages = chat.find_elements_by_class_name("i0jNr")
    for msg in messages:
        # 调用JS遍历子节点保证顺序
        full_content = driver.execute_script("""
            const innerSpan = arguments[0].querySelector('span');
            let parts = [];
            innerSpan.childNodes.forEach(node => {
                // 处理emoji元素
                if (node.nodeType === 1 && node.tagName === 'IMG' && node.classList.contains('emoji')) {
                    parts.push(node.alt);
                }
                // 处理普通文本
                else if (node.nodeType === 3) {
                    // 清理文本多余的引号和首尾空格
                    let text = node.textContent.trim().replace(/^"|"$/g, '');
                    if (text) parts.push(text);
                }
            });
            // 返回拼接后的完整内容,要逐行输出拆分元素可直接返回parts数组
            return parts.join(' ');
        """, msg)
        print(full_content)

如果需要逐行输出每个拆分元素,只需要把JS代码中最后的return parts.join(' ')改为return parts,再遍历返回的数组逐个打印即可。

效果验证

针对你提供的HTML结构,上述代码输出结果完全符合预期:😅 how 👹 are you 🎂

内容的提问来源于stack exchange,提问作者Pranav Patil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:21:02