rg8*_*g88 5 php python unicode replace html-entities
我是一个完全蟒蛇的菜鸟,所以请耐心等待.我想让python扫描一个html页面,并用UTF-8兼容的东西替换Microsoft Word实体的实例.
我的问题是,你是如何用Python做的(我用Google搜索了这个但到目前为止还没有找到明确的答案)?我想在Python水域中浸泡我的脚趾,所以我想到一些简单的东西,这是一个很好的起点.看来我需要:
在PHP中,我会这样做:
$test = $_POST['pasted_from_Word']; //for example “Going Mobile”
function defangWord($string)
{
$search = array(
(chr(0xe2) . chr(0x80) . chr(0x98)),
(chr(0xe2) . chr(0x80) . chr(0x99)),
(chr(0xe2) . chr(0x80) . chr(0x9c)),
(chr(0xe2) . chr(0x80) . chr(0x9d)),
(chr(0xe2) . chr(0x80) . chr(0x93)),
(chr(0xe2) . chr(0x80) . chr(0x94)),
(chr(0x2d))
);
$replace = array(
"‘",
"’",
"“",
"”",
"–",
"—",
"–"
);
return str_replace($search, $replace, $string);
}
echo defangWord($test);
Run Code Online (Sandbox Code Playgroud)
你会怎么用Python做的?
编辑:嗯,好吧,暂时忽略我对UTF-8和实体的困惑.输入包含从MS Word粘贴的文本.卷曲引号之类的东西显示为奇数符号.我以前尝试修复它的各种PHP函数都没有给我我想要的结果.通过在十六进制编辑器中查看这些奇数符号,我看到它们对应于我上面使用的符号(0xe2,0x80等).所以我只是用HTML实体换掉了古怪的角色.因此,如果我上面的位已经是UTF-8,那么从MS Word中粘贴的是什么导致奇数符号呢?
编辑2:所以我开始学习一些关于Python的知识,发现我并不真正理解编码.我试图解决的问题可以简单地通过从头到尾进行一致的编码来处理.如果输入表单是UTF-8,则存储输入的数据库是UTF-8,输出它的页面是UTF-8 ...从Word粘贴工作正常.无需特殊功能.现在,关于学习一点Python ...
Mil*_*les 20
首先,那些不是Microsoft Word实体 - 它们是 UTF-8.您正在将它们转换为HTML实体.
Pythonic写出类似的东西:
chr(0xe2) . chr(0x80) . chr(0x98)
Run Code Online (Sandbox Code Playgroud)
将会:
'\xe2\x80\x98'
Run Code Online (Sandbox Code Playgroud)
但是Python已经为你想要做的转换类型提供了内置功能:
def defang(string):
return string.decode('utf-8').encode('ascii', 'xmlcharrefreplace')
Run Code Online (Sandbox Code Playgroud)
这将替换字符串中的UTF-8代码,用于像‘数字实体这样的字符“.
如果要在可能的情况下用命名的替换那些数字实体:
import re
from htmlentitydefs import codepoint2name
def convert_match_to_named(match):
num = int(match.group(1))
if num in codepoint2name:
return "&%s;" % codepoint2name[num]
else:
return match.group(0)
def defang_named(string):
return re.sub('&#(\d+);', convert_match_to_named, defang(string))
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
>>> defang_named('\xe2\x80\x9cHello, world!\xe2\x80\x9d')
'“Hello, world!”'
Run Code Online (Sandbox Code Playgroud)
要完成答案,处理文件的示例的等效代码如下所示:
# in Python, it's common to operate a line at a time on a file instead of
# reading the entire thing into memory
my_file = open("test100.html")
for line in my_file:
print defang_named(line)
my_file.close()
Run Code Online (Sandbox Code Playgroud)
请注意,这个答案针对Python 2.5; Python 3+的Unicode情况大不相同.
我也同意bobince的评论如下:如果您可以保留UTF-8格式的文本并使用正确的内容类型和字符集发送,请执行此操作; 如果你需要它是ASCII,那么坚持使用数字实体 - 真的不需要使用命名的实体.
| 归档时间: |
|
| 查看次数: |
2643 次 |
| 最近记录: |