在python中将html实体转换为它们的值

时间:2010-05-02 23:26:43

标签: python special-characters html-entities

我在一些输入上使用这个正则表达式,

[^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..)

有没有办法可以将它们转换为它们的值,以便满足regexp表达式?我也不知道为什么文本决定如此之大。

3 个答案:

答案 0 :(得分:4)

鉴于您的文本似乎有数字编码而非命名的实体,您可以先将包含xml实体defs(&符号,哈希,数字,分号)的字节字符串转换为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)

如果你的终端模拟器可以显示任意的unicode字形,那么print u将会显示

ã, ن, ش

在任何情况下,如果您愿意,您现在可以使用原始RE,并且您不会意外地“捕获”实体,只会出现ascii字母,数字和您列出的几个标点字符。 (我不确定那是你真正想要的 - 为什么没有重音字母,但仅仅是ascii? - 但是,如果它 你想要什么,它会起作用。)

如果您 除了数字编码实体之外还有命名实体,您还可以 应用另一个答案中推荐的htmlentitydefs标准库模块(它只处理映射到Latin-1代码点的命名实体。

答案 1 :(得分:1)

您可以调整以下脚本:

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实体”,希望我没有浪费时间回答错误的问题;)

答案 2 :(得分:0)

在不知道表达式被用于什么的情况下,我无法确切地说出你需要什么。

这将匹配特殊字符或字符串,不包括字母,数字,@和#:

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