python将字符实体引用转换成 Unicode 字符

HTML Entities 的格式如:&lt;,NCR 的格式如:< 或 <,均都表示“<” 字符。
HTML 中规定了 Character entity references,在 “24.2.1 The list of characters” 列出了 HTML Entities 和 NCR 的对应关系,例如:

<!ENTITY nbsp   CDATA " " -- no-break space = non-breaking space, U+00A0 ISOnum -->
<!ENTITY iexcl  CDATA "¡" -- inverted exclamation mark, U+00A1 ISOnum -->
<!ENTITY yen    CDATA "¥" -- yen sign = yuan sign, U+00A5 ISOnum -->

那在 Python 中我们如何将 HTML Entities 和 NCR 转换成普通字符呢?

在回答这个问题之前,我们做一些简单的回顾:

group 方法

group([group1,…])
group 属于 Match Object 对象拥有的方法,返回匹配到的一个或者多个子组。如果是一个参数,那么结果返回字符串,如果是多个参数,则返回元组。group1 的默认值为 0 (将返回所有的匹配值),如果 groupX 的值是 [1…99] 范围之内的,那么将匹配对应括号组的字符串。如果组号是负的或者比 pattern 中定义的组号大,那么将抛出 IndexError 异常。若 pattern 没有匹配到,但 group 匹配到,那么 group 的值也为 None。如果一个 pattern 可以匹配多个,那么组对应匹配的最后一个。
re.sub 方法
re.sub(pattern , replace , string [, count])
sub 属于 re 模块的字符串替换和修改函数,其在目标字符串中查找与正则相匹配的字符串,并将其替换成指定的字符串。
pattern 参数——需要匹配的正则规则
replace 参数——指定用来替换的字符串或函数。如果 replace 是函数,则会对所有的匹配都回调此函数,这个函数使用单个 Match Object 作为参数,然后返回替换后的字符串。
string 参数——目标字符串
count 参数——最多替换的次数,未指定,则将替换所有匹配到的字符串
re.sub() 的使用案例如下:

 代码如下 复制代码

import re
def dashrepl(matchobj):
    if matchobj.group(0) == '-':
        return ' '
    else:
        return '-'
re.sub('-{1,2}', dashrepl, 'pro----gram-files')

# result: 'pro--gram files'
htmlentitydefs
htmlentitydefs 有三个属性,详细如下:
entitydefs:A dictionary mapping XHTML 1.0 entity definitions to their replacement text in ISO Latin-1.
name2codepoint:A dictionary that maps HTML entity names to the Unicode codepoints. New in version 2.3.
codepoint2name:A dictionary that maps Unicode codepoints to HTML entity names.

实际存在的形式大致如下:

 代码如下 复制代码

entitydefs = {'AElig': '\xc6', 'Aacute': '\xc1', 'Acirc': '\xc2', ...}
name2codepoint = {'AElig': 198, 'Aacute': 193, 'Acirc': 194, ...}
codepoint2name = {34: 'quot', 38: 'amp', 60: 'lt', 62: 'gt', ...}

对于我们来说,此时最有用的是 name2codepoint 属性,比如:“<”,name 是 lt,我们可以通过 name2codepoint[lt] 获得其 code point:60。

unichr 方法

unichr 是字符串的方法(unichr(int)),可以将整数转化成相应的 Unicode 字符,比如: unichr(60) –> u'\u003c' or u'<'

 代码如下 复制代码

import re, htmlentitydefs

##
# Removes HTML or XML character references and entities from a text string.
#
# @param text The HTML (or XML) source text.
# @return The plain text, as a Unicode string, if necessary.

def unescape(text):
    def convert(matchobj):
        text = matchobj.group(0)
        if text[:2] == "&#":
            # Numeric Character Reference
            try:
                if text[:3] == "&#x":
                    return unichr(int(text[3:-1], 16))
                else:
                    return unichr(int(text[2:-1]))
            except ValueError:
                pass
        else:
            # Character entities references
            try:
                text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
            except KeyError:
                pass
        return text # Return Unicode characters
    return re.sub("&#?\w+;", convert, text)

网友提供了将Unicode中文字符串转换成 string字符串

普通字符串可以用多种方式编码成Unicode字符串,具体要看你究竟选择了哪种编码:

 代码如下 复制代码
unicodestring = u"Hello world"
# 将Unicode转化为普通Python字符串:"encode" 
utf8string = unicodestring.encode("utf-8") 
asciistring = unicodestring.encode("ascii") 
isostring = unicodestring.encode("ISO-8859-1") 
utf16string = unicodestring.encode("utf-16") 
# 将普通Python字符串转化为Unicode:"decode" 
plainstring1 = unicode(utf8string, "utf-8") 
plainstring2 = unicode(asciistring, "ascii") 
plainstring3 = unicode(isostring, "ISO-8859-1") 
plainstring4 = unicode(utf16string, "utf-16") 
assert plainstring1 == plainstring2 == plainstring3 == plainstring4
时间: 2024-07-28 20:43:33

python将字符实体引用转换成 Unicode 字符的相关文章

使用Java将中文字符转换成Unicode编码

  这两天操作XML使用到了Jdom,在创建XML文件并输出到硬盘的时候遇到一个中文编码的问题:Jdom默认输出的XML编码是UTF-8,但是文档中如果出现中文字符那么该中文字符就会变成乱码,造成XML文件无法被正确解析. UTF-8应该是可以用来表示中文的吧?我不知道这是不是Jdom的一个BUG(Jdom 1.0,beta了10次的产物哦!).我google了一下,大家解决这个问题的办法无非是把Jdom的输出字符集改为GBK或者GB2312,但是这样就会有一些副作用,如果在没有特定字符集(GB

怎么把一串字符串转换成Unicode

问题描述 怎么把一串字符串转换成Unicode只转换汉字不转换字母和数字.例如小张zzz123只把小张转换了zzz123不转换. 解决方案 解决方案二:同问啊解决方案三:遍历吧.解决方案四:你是问C++吗?这在C#里面根本不会问这样的问题,因为C#里面的字符串都是Unicode的,不需要转换.解决方案五:privatestringCapText(Matchm){byte[]bs=Encoding.Default.GetBytes(m.ToString());strings=Encoding.Un

python实现将元祖转换成数组的方法

  这篇文章主要介绍了python实现将元祖转换成数组的方法,涉及Python中list方法的使用技巧,需要的朋友可以参考下 本文实例讲述了python实现将元祖转换成数组的方法.分享给大家供大家参考.具体分析如下: python的元祖使用一对小括号表示的,元素是固定的,如果希望添加新的元素,可以先将元祖转换成数组列表,再进行操作 ? 1 2 3 colour_tuple = ("Red","Green","Blue") colour_list

unicode编码转换:PHP将汉字转换成Unicode编码的函数

这是一个将汉字转换成Unicode编码的PHP函数,支持GBK和UTF8编码.function uni_decode ($uncode){$word = json_decode(preg_replace_callback('/(\d{5});/', create_function('$dec', 'return \'\\u\'.dechex($dec[1]);'), '"'.$uncode.'"'));return $word;}对 Unicode 转换为汉字function uni_

从数据库读出的JPG文件的字符流,转换成图片显示

数据|数据库|显示|转换 从数据库读出的JPG文件的字符流,转换成图片显示在页面上的相关代码 public void doPost(HttpServletRequest req, HttpServletResponse res)    throws ServletException, IOException {    ServletOutputStream out = res.getOutputStream();    Statement dispStmt = null, setStmt = n

将二进制字符转换成普通字符(multipart/form-data取出)

form-data|multipart|二进制|转换 <%response.expires=0'目的:将二进制字符转换成普通字符Function bin2str(binstr)Dim varlen,clow,ccc,skipflagskipflag=0ccc = ""varlen=LenB(binstr)For i=1 To varlenIf skipflag=0 Thenclow = MidB(binstr,i,1)If AscB(clow) > 127 Thenccc

python实现将html表格转换成CSV文件的方法

  本文实例讲述了python实现将html表格转换成CSV文件的方法.分享给大家供大家参考.具体如下: 使用方法:python html2csv.py *.html 这段代码使用了 HTMLParser 模块 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 5

编写Python脚本把sqlAlchemy对象转换成dict的教程

  这篇文章主要介绍了编写Python脚本把sqlAlchemy对象转换成dict的教程,主要是基于Python的model类构建一个转换的方法,需要的朋友可以参考下 在用sqlAlchemy写web应用的时候,经常会用json进行通信,跟json最接近的对象就是dict,有时候操作dict也会比操作ORM对象更为方便,毕竟不用管数据库session的状态了. 假设数据库里有一张post表,其中一种方法就是 ? 1 2 p = session.query(Post).first() p.__di

python使用reportlab实现图片转换成pdf的方法

  本文实例讲述了python使用reportlab实现图片转换成pdf的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #!/usr/bin/env python import os import sys from reportlab.lib.pagesizes import A4, landscape from reportlab.pdfgen import canvas f = sys.argv[1]