python实现html代码转义转换

2014年12月18日 发表评论 阅读评论

之前记录了从网上翻来的 Python HTMLParser处理HTML转义字符 文档。不过在对带有中文字符的内容进行处理的时候会报错,代码如下:

# cat html.py
#/usr/bin/python
#coding=utf-8
import HTMLParser
html_parser = HTMLParser.HTMLParser()
title = 'eclipse功能<template>学习。e.g : 快速在代码中插入时间戳 - 361way.com'
newtitle = html_parser.unescape(title)
print newtitle

报错内容如下:

Traceback (most recent call last):
  File "html.py", line 7, in <module>
    newtitle = html_parser.unescape(title)
  File "/usr/lib64/python2.6/HTMLParser.py", line 390, in unescape
    return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|w{1,8}));", replaceEntities, s)
  File "/usr/lib64/python2.6/re.py", line 151, in sub
    return _compile(pattern, 0).sub(repl, string, count)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 7: ordinal not in range(128)

解决方法如下:

#/usr/bin/python
#coding=utf-8
import HTMLParser
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
html_parser = HTMLParser.HTMLParser()
title = 'eclipse功能&lt;template&gt;学习。e.g : 快速在代码中插入时间戳 - SegmentFault'
newtitle = html_parser.unescape(title)
print newtitle

需要载入sys模块,重新设置默认编码为utf8,就不会出错了。不过要处理的内容只不过是一个文章的title部分,而常用的html转义内容也就如下几个:

字符 十进制 转义字符
" &#34; &quot;
& &#38; &amp;
< &#60; &lt;
> &#62; &gt;
不断开空格(non-breaking space) &#160; &nbsp;

注:不常用的具体可以参看开源中国在线工具上的html转义字符表

于是决定使用python的replace功能实现一个简单的转义功能函数,具体如下:

#/usr/bin/python
#coding=utf-8
def replace_html(s):
    s = s.replace('&quot;','"')
    s = s.replace('&amp;','&')
    s = s.replace('&lt;','<')
    s = s.replace('&gt;','>')
    s = s.replace('&nbsp;',' ')
    s = s.replace(' - 361way.com','')
    print s
replace_html(title)

优点就是快速简洁,不依赖于模块,实用时也无需再reload sys模块指定默认编码。




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.