Вы можете использовать метод str.translate и данные в пакете html python для преобразования символов в эквивалентную сущность html.
Для этого str.translate
нужен словарь, который отображает символы (технически целочисленное представление символа или ordinal ) в html-сущности.
html.entities.codepoint2name
содержит необходимые данные, но имена сущностей не ограничены'&' а также ';'.Вы можете использовать dict-понимание для создания таблицы с нужными вам значениями.
После того, как таблица будет создана, вызовите метод translate вашей строки с таблицей в качестве аргумента, и результатом будет новая строка, в которойлюбые символы с эквивалентом HTML-объекта будут преобразованы.
>>> import html.entities
>>> s = 'vèlit'
>>> # Create the translation table
>>> table = {k: '&{};'.format(v) for k, v in html.entities.codepoint2name.items()}
>>> s.translate(table)
'vèlit'
>>> 'Voilà'.translate(table)
'Voilà'
Имейте в виду, что акцентированные латинские символы могут быть представлены комбинацией кодовых точек Юникода: 'è' может быть представлен единственной кодовой точкой - МАЛЕНЬКОЕ ПИСЬМО E С ГРАВИЕЙ - или две кодовые точки - МАЛЕНЬКОЕ ПИСЬМО ЛАТИНЫ E , за которым следует АКЦЕНТ КОМБИНИРОВАНИЯ GRAVE .В последнем случае (известном как декомпозированная форма ) перевод не будет работать должным образом.
Чтобы обойти это, вы можете преобразовать код с двумя кодами декомпозированный форма для единственной кодовой точки составленная форма с использованием функции normalize из модуля unicodedata в стандартной библиотеке Python.
>>> decomposed
'vèlit'
>>> decomposed == s
False
>>> len(decomposed) # decomposed is longer than composed
6
>>> decomposed.translate(table)
'vèlit'
>>> composed = unicodedata.normalize('NFC', decomposed)
>>> composed == s
True
>>> composed.translate(table)
'vèlit'