IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    血衫非弧の一存发表于 2024-08-17 00:00:00
    love 0

    今天在使用 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+0000 到 U+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 字符替换为一个占位符 �。



沪ICP备19023445号-2号
友情链接