解码html内容和HTMLParser

Dan*_*man 3 python

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

' ' '&'  '–' '…'
Run Code Online (Sandbox Code Playgroud)

我想用他们的英语同行替换他们

' ' (space), '&', '-', '...', and so on.
Run Code Online (Sandbox Code Playgroud)

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

我的文字类似于:

Some text goes here&after that, 6:30 pm–8:45pm and maybe 
something like …
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

Some text goes here & after that, 6:30 pm-8:45pm and maybe 
something like ...
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 9

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

>>> HTMLParser.HTMLParser().unescape('a < é – …')
u'a < é – …'
Run Code Online (Sandbox Code Playgroud)

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

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

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

>>> unicodedata.normalize('NFKC', u'a < – …')
u'a < é – ...'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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