将字符实体引用转换成 Unicode 字符
发布时间:2011-07-01 12:31:51
首先我们一起来看下 Character entities references (HTML Entities)和 Numeric Character Reference (NCR)的异同:
HTML Entities 的格式如:<
,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)
扩展阅读:


猜你喜欢
- 前言随着行业的发展,编程能力逐渐成为软件测试从业人员的一项基本能力。因此在笔试和面试中常常会有一定量的编码题,主要考察以下几点。基本编码能力
- 先按照下面的表结构创建mysql_order_by_test数据表,我们用实例一点一点告诉你,MySQL order by的用法。ORDER
- 1.如何获取表单<select>域的选择部分的文本? <form name="a"> <s
- cv::Mat 图像格式 (Data Type)命名规则通用的参数命名格式为:CV_{元素比特数}{元素类型}C{通道数}1最常见的 CV_
- 1.cURL介绍 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PH
- 论文:Interactive Image Warping(1993年Andreas Gustafsson)算法思路:以眼睛中心为中心点,对眼
- 1 Python自动绘图在这里我主要运用了pyautocad库进行AutoCAD的自动化操作,pyautocad是一款功能非常强大的Auto
- 对开区间和闭区间的理解对于开区间,本身已经不包含两端点值,所以根本满足不了连续的第一个要求,所以要说某一开区间连续,我们说是函数在这一开区间
- python简单的学生信息管理系统-文件版,供大家参考,具体内容如下功能如下主函数部分增加学生信息修改学生信息删除学生信息查询学生显示所有学
- 当然,这些并非真正的定律,而只是一些有益的忠告,使你免陷于使用层时可能的困顿中。原来有九条定律的,我们精简掉一条,还有下面的八条:1. 如果
- 最近消费kafka数据到磁盘的时候遇到了这样的问题:需求:每天大概有1千万条数据,每条数据包含19个字段信息,需要将数据写到服务器磁盘,以第
- 方式一import matplotlib.pyplot as pltimport numpy as npfrom scipy.stats i
- 前言报错如下:Could not open JDBC Connection for transaction; nested exceptio
- 环境:vue 2.9.3; webpack目的:接口的调用跨域方式:1、express中间的使用2、nginx代理3、谷歌浏览器跨域设置--
- 好不容易有个周末,不能闲着,趁着这个时间安装sql server2016正式版,下载那个安装包都用了一个星期安装包可以从这里下载:http:
- @ResponseBody 和 @RequestBody 注解的区别1 前言在详述 @ResponseBody 和 @RequestBody
- 需求分析项目上需要用到手机号前7位,判断号码是否合法,还有归属地查询。旧的数据是几年前了太久了,打算用python爬虫重新爬一份单线程版本#
- 哈夫曼树原理秉着能不写就不写的理念,关于哈夫曼树的原理及其构建,还是贴一篇博客吧。https://www.jb51.net/article/
- 废话还是说太多了 直接上代码import randomimport sys# 牌面列表card_code = ['A', &
- collections是Python内建的一个集合模块,提供了许多有用的集合类。这里举几个例子:namedtuple我们知道tuple可以表