解析HTML内容和HTML解析器
我正在创建一个基于'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 个回答
你的问题分成两个部分。第一个部分比较简单,就是解码HTML实体。最简单的方法是使用HTMLParser模块里的一个不太正式但已经稳定很久的方法:
>>> HTMLParser.HTMLParser().unescape('a < é – …')
u'a < é – …'
第二个部分是把Unicode字符转换成看起来像ASCII的字符,这个就复杂一些,而且也有点争议。我建议你尽量保留Unicode中的一些特殊字符,比如‘–’这样的短横线,而不是把它们转换成普通的短横线或直引号。除非你的应用完全不能处理非ASCII字符,否则最好还是保持它们的原样,包括其他所有的Unicode字符。
关于U+2013这个省略号字符,它的情况可能有点不同,因为它是一个“兼容字符”,Unicode中包含它是为了能无损地转换到其他编码。如果可以的话,最好直接输入三个点,让字体自己处理怎么显示。
如果你想只替换一些兼容字符(比如这个字符、一些特殊的连字、日文全角数字以及其他一些奇怪的字符),你可以尝试把字符串规范化为正常形式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)都有各自的实现,但结果差别挺大的。