Преобразование HTML-сущностей в их значения в Python - PullRequest
2 голосов
/ 03 мая 2010

Я использую это регулярное выражение для некоторого ввода,

[^a-zA-Z0-9@#]

Однако это приводит к удалению большого количества специальных символов HTML во входных данных, таких как

#227;, #1606;, #1588; (i had to remove the & prefix so that it wouldn't 
show up as the actual value..)

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

Ответы [ 3 ]

4 голосов
/ 03 мая 2010

Учитывая, что ваш текст содержит числовые, а не именованные сущности, вы можете сначала преобразовать вашу байтовую строку, содержащую определения сущностей xml (амперсанд, хэш, цифры, точки с запятой) в Unicode:

import re
xed_re = re.compile(r'&#(\d+);')
def usub(m): return unichr(int(m.group(1)))

s = 'ã, ن, ش'
u = xed_re.sub(usub, s)

если ваш эмулятор терминала может отображать произвольные символы Юникода, тогда print u покажет

ã, ن, ش

В любом случае, теперь вы можете, если хотите, использовать свой оригинальный RE, и вы не будете случайно «ловить» объекты, только буквы, цифры и пару знаков препинания, которые вы перечислили. (Я не уверен, что это то, что вы действительно хотите - почему бы не буквы с акцентом, а только буквы ascii, например? - но, если это равно , что вы хотите, это будет работать).

Если у вас до есть именованные объекты в дополнение к числовым кодам, вы можете также применить стандартный библиотечный модуль htmlentitydefs, рекомендованный в другом ответе (он касается только однако именованные объекты, которые отображаются на кодовые точки Latin-1).

1 голос
/ 03 мая 2010

Вы можете адаптировать следующий скрипт:

import htmlentitydefs
import re

def substitute_entity (match):
    name = match.group (1)
    if name in htmlentitydefs.name2codepoint:
        return unichr (htmlentitydefs.name2codepoint[name])
    elif name.startswith ('#'):
        try:
            return unichr (int (name[1:]))
        except:
            pass

    return '?'

print re.sub ('&(#?\\w+);', substitute_entity, 'x « y &wat; z {')

Здесь выдает следующий ответ:

x « y ? z {

РЕДАКТИРОВАТЬ: Я понял вопрос как «как избавиться от сущностей HTML перед дальнейшей обработкой», надеюсь, я не потратил впустую время на ответ на неправильный вопрос;)

0 голосов
/ 03 мая 2010

Не зная, для чего используется это выражение, я не могу точно сказать, что вам нужно.

Это будет соответствовать специальным символам или строкам символов, исключая буквы, цифры, @ и #:

[^a-zA-Z0-9@#]*|#[0-9A-Za-z]+;
...