解码html内容和HTMLParser

时间:2011-08-22 18:51:23

标签: python

我正在创建一个基于'HTMLParser'的子类来提取html内容。每当我有字符引用,如

' ' '&'  '–' '…'

我想用英文版

代替它们
' ' (space), '&', '-', '...', and so on.

将一些简单字符引用转换为正确表示的最佳方法是什么?

我的文字类似于:

Some text goes here&after that, 6:30 pm–8:45pm and maybe 
something like …

我想将其转换为:

Some text goes here & after that, 6:30 pm-8:45pm and maybe 
something like ...

1 个答案:

答案 0 :(得分:9)

您的问题分为两部分。简单的部分是解码HTML实体。最简单的方法是从HTMLParser模块中获取这个未记录但长期稳定的方法:

>>> HTMLParser.HTMLParser().unescape('a < é – …')
u'a < é – …'

第二部分,将Unicode字符转换为ASCII相似,比较棘手,也很值得怀疑。我会尝试保留Unicode en-dash' - '和类似的排版细节,而不是将它们转换为像纯连字符和直引号这样的字符。除非您的应用程序根本无法处理非ASCII字符,否则您应该将它们与所有其他Unicode字符一起保持原样。

U + 2013省略号字符的特定情况可能有所不同,因为它是一个“兼容性字符”,包含在Unicode中,仅用于对其他编码功能进行无损往返。最好你只需键入三个点,然后让字体的字形组合逻辑精确地计算出如何绘制它。

如果您只想替换兼容性字符(如此字符,显式连字,日语全宽数字和其他一些奇怪的字符),您可以尝试将字符串规范化为Normal Form KC:

>>> unicodedata.normalize('NFKC', u'a < – …')
u'a < é – ...'

(但是,小心:你可能想要保留的其他一些字符也是兼容性字符,包括'²'。)

下一步是将带有变音符号的字母转换为普通字母,您可以通过归一化到NFKD来执行,然后从字符串中删除所有具有“组合”字符类的字符。这将为您提供以前重音拉丁字母的纯ASCII,尽管这种方式对于许多语言来说在语言上并不正确。如果你关心的只是你可以直接编码为ASCII:

>>> unicodedata.normalize('NFKD', u'a < – …').encode('us-ascii', 'ignore')
'a < e  ...'

您可能需要做的任何事情都必须是临时的,因为没有可接受的将字符串折叠到ASCII的标准。 Windows有一个实现,Lucene(ASCIIFoldingFilter)也是如此。结果差异很大。