【问题标题】:How to properly decode and re-encode a file name from latin-1 in order to open it如何正确解码和重新编码来自 latin-1 的文件名以便打开它
【发布时间】:2019-04-03 12:36:04
【问题描述】:

我正在尝试使用 selenium 打开一个本地文件

driver.get( ('file://' + file ))

其中file 是文件名。

文件名中似乎包含 latin-1 字符:

..\\产品名称——Something Something.html

当我使用file.decode('latin-1') 时,我得到:

..\\产品名称\x96SomethingSomething.html

如果我简单地使用driver.get( ('file://' + file )),我会得到:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 81: invalid start byte

如果我使用driver.get( ('file://' + file.decode('latin_1') )),我会收到一条错误消息,指出找不到文件:

...fileNotFound&u=file%3A///C%3A/PRODUCT%20NAME%20%C2%96%20Something%20Something.html.

我不能 100% 确定它所期望的编码,但我尝试将文件名重新编码为 un​​icode 和 utf-8,但没有成功(同样的错误 - 说找不到文件)。

知道如何解决这个问题吗?不幸的是,重命名文件本身不是一个选项。我想正确解码,然后重新编码(其他人推荐的编码三明治)。

【问题讨论】:

    标签: python encoding iso-8859-1


    【解决方案1】:

    想通了。问题是 html 文档有charset='utf-8',严格来说它不是真的。标题中包含'-',即cp1252编码。

    我通过添加异常和字符纠正功能解决了这个问题:

    def selenium_extractor(file):
    
        def charset_correct(filename):
            try:
                return ''.join([char.decode('cp1252') for char in filename])
            except:
                # EXTEND WITH FURTHER DECODINGS
                traceback.print_exc()
                sys.exit(1)
    
    
        driver = webdriver.Firefox()
    
        try:
            driver.get( 'file://' + file)
            driver.quit()
    
        except UnicodeError:
            driver.get( 'file://' + charset_correct(file))
            driver.quit()
    

    【讨论】:

      猜你喜欢
      • 2019-12-09
      • 2012-01-07
      • 2011-04-25
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      相关资源
      最近更新 更多