Replace the damn br tags

"... without html2text!"

Posted by Wang Zhihao on 2017-01-13

本文主要想吐槽一下 html2text 的坑,顺便记录一下一次难得的reduce使用。

前几天遇到一个小bug,需要把提供给iPad的数据中的<br>标签替换成\n,于是我就直接使用了html2text这个库。用法如下:

import html2text
h = html2text.HTML2Text()
h.ignore_links = True
onlineclass = ...
detail = ...
detail.subject, detail.vocabularies, detail.sentences, detail.grammars = map(
lambda x: '' if x == 'N/A' else h.handle(x), [
onlineclass.objective, onlineclass.vocabularies,
onlineclass.sentence_patterns, onlineclass.grammar])

这样做的确可以把<br>标签去掉,但是没想到html2text这个库有一个这样的坑:

>>> h.handle('')
>>> '\n\n'
>>> h.handle('<br>')
>>> ' \n\n'

所以还是用比较暴力的str.replace()方法来替换吧。
虽然暴力,但是也要优雅,所以我拒绝使用str.replace().replace().replace()这样比较low的办法——不好看。

最终决定使用reduce,代码如下:

repls = {'<br>': '\n', '</br>': '\n', '<br/>': '\n'}
onlineclass = ...
detail = ...
detail.subject, detail.vocabularies, detail.sentences, detail.grammars = map(
lambda x: '' if x == 'N/A' else reduce(
lambda a, kv: a.replace(*kv), repls.iteritems(), x), [
onlineclass.objective, onlineclass.vocabularies,
onlineclass.sentence_patterns, onlineclass.grammar])