Python 3.5 заменяет акцентированный символ на HTML-сущность - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь автоматизировать серию запросов, но для этого мне нужно заменить символы на акценты соответствующей HTML-сущностью.По причинам он должен быть в Python3

Пример:

vèlit 
[needs to become] 
vèlit

Дело в том, что всякий раз, когда я пытаюсь сделать word.replace, он не находит его.

This:

if u'è' in sentence:
    print(u'Found è')

Работает и находит "è", но выполняет:

word.replace('è','è')

Ничего не делает.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Вы можете использовать метод 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'
0 голосов
/ 10 мая 2018

Замените word.replace('è','è') на word = word.replace('è','è') и напечатайте результат для проверки.

word.replace('è','è') работает, но фактически не вносит никаких изменений в сам контент word.

Чек str.replace ()

...