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

时间:2011-07-01 12:31:51 

首先我们一起来看下 Character entities references (HTML Entities)和 Numeric Character Reference (NCR)的异同:

HTML Entities 的格式如:&lt;,NCR 的格式如:&#60;&#x3c;,均都表示“<” 字符。

HTML 中规定了 Character entity references,在 “24.2.1 The list of characters” 列出了 HTML Entities 和 NCR 的对应关系,例如:

<!ENTITY nbsp   CDATA "&#160;" -- no-break space = non-breaking space, U+00A0 ISOnum -->
<!ENTITY iexcl  CDATA "&#161;" -- inverted exclamation mark, U+00A1 ISOnum -->
<!ENTITY yen    CDATA "&#165;" -- 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,字符
0
投稿

猜你喜欢

  • Python+Matplotlib+LaTeX玩转数学公式

    2022-01-03 22:10:38
  • PyQt5每天必学之带有标签的复选框

    2021-04-30 05:27:06
  • python Selenium等待元素出现的具体方法

    2022-02-22 02:47:20
  • pytest实现多进程与多线程运行超好用的插件

    2023-03-23 15:56:23
  • 让所有IE支持HTML5的解决方案

    2009-10-31 18:43:00
  • js实现鼠标悬浮给图片加边框的方法

    2024-04-18 09:40:22
  • 成功的用户界面的八个特性[译]

    2009-04-20 20:36:00
  • mysql聚簇索引的页分裂原理实例分析

    2024-01-15 00:58:47
  • Python编写百度贴吧的简单爬虫

    2023-12-06 02:17:56
  • Python标准库之Math,Random模块使用详解

    2021-02-09 22:33:13
  • pandas学习之df.set_index的具体使用

    2021-11-12 07:35:20
  • 详细分析Python collections工具库

    2022-06-28 01:18:57
  • 使用JS轻松实现ionic调用键盘搜索功能(超实用)

    2024-04-17 10:26:21
  • python学习之whl文件解释与安装详解

    2021-11-01 18:09:14
  • tensorflow实现从.ckpt文件中读取任意变量

    2023-01-04 15:39:40
  • 命令行运行Python脚本时传入参数的三种方式详解

    2021-11-30 00:16:08
  • 详解Python手写数字识别模型的构建与使用

    2023-10-21 18:34:12
  • python同义词替换的实现(jieba分词)

    2022-02-10 20:58:00
  • 关于Python OS模块常用文件/目录函数详解

    2023-07-04 06:30:06
  • pytorch中的transforms模块实例详解

    2022-04-25 19:50:58
  • asp之家 网络编程 m.aspxhome.com