解决 Python Selenium 读取含颜文字文件时的 ChromeDriver 错误

今天在使用 Python Selenium 自动化浏览器操作的过程中,遇到了一个处理包含颜文字或其他非标准字符的错误。

问题描述

我正在编写一段 Python Selenium 代码来自动化填充网页上的文本框。我们需要从一个文件中读取文本,并将其输入到页面的 textarea 中。然而,当文件中包含颜文字或其他非 Basic Multilingual Plane (BMP) 字符时,程序可能会抛出如下错误:

Message: unknown error: ChromeDriver only supports characters in the BMP
(Session info: chrome=122.0.6261.94)

这个错误是由于 ChromeDriver 目前只支持 BMP 范围内的字符。BMP 是 Unicode 的一个子集,包含了从 U+0000U+FFFF 的字符,而一些特殊字符(如颜文字、部分表情符号等)超出了这个范围,位于 Supplementary Multilingual Plane (SMP) 或其他Plane中。

错误代码示例

首先,我们来看一下可能导致错误的代码示例:

import os
from selenium import webdriver

# 初始化 WebDriver
driver = webdriver.Chrome()

# 假设我们要输入文本到一个textarea中
last_textarea = driver.find_element(By.ID, "textarea_id")

# 读取文件内容
text_to_enter = ""
file_path = "path/to/your/file.txt"
if os.path.exists(file_path):
    print(f"打开文件 {file_path}")
    with open(file_path, 'r', encoding='utf-8') as file:
        text_to_enter = file.read()
else:
    print(f"文件 {file_path} 不存在")

# 将内容输入到textarea中
last_textarea.send_keys(text_to_enter)
print("输入: " + text_to_enter)

当文件中包含超出 BMP 范围的字符时,send_keys 方法会抛出上述错误。

解决方案

1. 过滤掉非 BMP 字符

最简单的方法是过滤掉所有不在 BMP 范围内的字符。这可以通过 Python 的字符编码范围来实现:

def filter_non_bmp(text):
    return ''.join(c for c in text if c <= '\uFFFF')

# 读取文件内容并过滤非BMP字符
text_to_enter = ""
file_path = "path/to/your/file.txt"
if os.path.exists(file_path):
    print(f"打开文件 {file_path}")
    with open(file_path, 'r', encoding='utf-8') as file:
        text_to_enter = file.read()
    text_to_enter = filter_non_bmp(text_to_enter)
else:
    print(f"文件 {file_path} 不存在")

# 将过滤后的内容输入到textarea中
last_textarea.send_keys(text_to_enter)
print("输入: " + text_to_enter)

这段代码会移除所有不在 BMP 范围内的字符,从而避免 ChromeDriver 抛出错误。

2. 替换非 BMP 字符

如果我们希望保留文本的完整性,而不是直接删除字符,可以考虑将非 BMP 字符替换为一些替代字符或转义符:

def replace_non_bmp(text, replacement='�'):
    return ''.join(c if c <= '\uFFFF' else replacement for c in text)

# 读取文件内容并替换非BMP字符
text_to_enter = ""
file_path = "path/to/your/file.txt"
if os.path.exists(file_path):
    print(f"打开文件 {file_path}")
    with open(file_path, 'r', encoding='utf-8') as file:
        text_to_enter = file.read()
    text_to_enter = replace_non_bmp(text_to_enter)
else:
    print(f"文件 {file_path} 不存在")

# 将替换后的内容输入到textarea中
last_textarea.send_keys(text_to_enter)
print("输入: " + text_to_enter)

在这个示例中,我将所有非 BMP 字符替换为一个占位符


在 Windows 中设置定时任务并查看系统运行时间和信息 在 macOS zsh 下删除 .tgz 文件外的所有文件和文件夹