Как правильно декодировать и перекодировать имя файла из латиницы-1, чтобы открыть его - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь открыть локальный файл в селене, используя

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

где file - имя файла.

Кажется, имя файла содержит символы латинского алфавита:

.. \\ ИМЯ ПРОДУКТА - Something Something.html

когда я использую file.decode('latin-1'), я получаю:

.. \\ ИМЯ ПРОДУКТА \ x96 Something Something.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%, какую кодировку он ожидает, но я попытался перекодировать имя файла в Unicode и UTF-8 без удачи (та же ошибка - говорит, что файл не найден).

Есть идеи, как мне решить эту проблему? Переименование самого файла, к сожалению, не подойдет. Я хочу правильно его декодировать, а затем перекодировать (сэндвич кодирования рекомендовали другие).

1 Ответ

0 голосов
/ 30 октября 2018

Разобрался. Проблема в том, что 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()
...