一些基本的Python问题

时间:2009-04-16 01:41:41

标签: php python unicode replace html-entities

我是一个完全蟒蛇的菜鸟,所以请耐心等待我。我想让python扫描一个html页面,并用UTF-8兼容的东西替换Microsoft Word实体的实例。

我的问题是,你是如何用Python做的(我用Google搜索了这个但到目前为止还没有找到明确的答案)?我想在Python水域中浸泡我的脚趾,所以我想到一些简单的东西,这是一个很好的起点。我似乎需要:

  1. 将从MS Word粘贴的文本加载到变量
  2. 在内容上运行某种替换功能
  3. 输出
  4. 在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); 
    

    你会怎么用Python做的?

    编辑:嗯,好吧,暂时忽略我对UTF-8和实体的困惑。输入包含从MS Word粘贴的文本。卷曲引号之类的东西显示为奇数符号。我以前尝试修复它的各种PHP函数都没有给我我想要的结果。通过在十六进制编辑器中查看这些奇数符号,我看到它们对应于我上面使用的符号(0xe2,0x80等)。所以我只是用HTML实体换掉了古怪的角色。因此,如果我上面的位已经是UTF-8,那么从MS Word中粘贴的是什么导致奇数符号呢?

    EDIT2:所以我开始学习一些关于Python的知识,发现我并不真正理解编码。我试图解决的问题可以简单地通过从头到尾进行一致的编码来处理。如果输入表单是UTF-8,则存储输入的数据库是UTF-8,输出它的页面是UTF-8 ...从Word粘贴工作正常。无需特殊功能。现在,关于学习一点Python ......

4 个答案:

答案 0 :(得分:20)

首先,那些不是Microsoft Word实体 - 他们 UTF-8。您正在将它们转换为HTML实体。

Pythonic写出类似的东西:

chr(0xe2) . chr(0x80) . chr(0x98)

将是:

'\xe2\x80\x98'

但是Python已经为你想要做的转换类型提供了内置功能:

def defang(string):
    return string.decode('utf-8').encode('ascii', 'xmlcharrefreplace')

这会将等字符的字符串中的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))

并像这样使用它:

>>> defang_named('\xe2\x80\x9cHello, world!\xe2\x80\x9d')
'“Hello, world!”'

要完成答案,处理文件的示例的等效代码如下所示:

# 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()

请注意,这个答案针对Python 2.5; Python 3 +的Unicode情况大不相同。

我也同意bobince的评论如下:如果您可以保留UTF-8格式的文本并使用正确的内容类型和字符集发送,请执行此操作;如果你需要它是ASCII,那么坚持使用数字实体 - 实际上不需要使用命名的实体。

答案 1 :(得分:3)

Python代码具有相同的轮廓。

用Python-isms替换所有PHP主义。

首先创建一个File对象。 file.read()的结果是string对象。字符串具有“替换”操作。

答案 2 :(得分:2)

清理Word HTML的最佳选择是使用HTML Tidy,其中只有一种模式。如果您需要以编程方式执行,可以使用a few Python wrappers

答案 3 :(得分:1)

正如S.Lott所说,Python代码非常非常相似 - 唯一的区别主要是函数调用/语句。

我认为Python没有直接等同于file_get_contents(),但由于你可以在文件中获得一行数组,然后可以通过换行符加入它们,如下所示:

sample = '\n'.join(open(test, 'r').readlines())

编辑:没关系,有一种更简单的方法:sample = file(test).read()

字符串替换与str_replace()几乎完全相同:

sample = sample.replace(search, replace)

输出就像print语句一样简单:

print defang_word(sample)

正如您所看到的,这两个版本看起来几乎完全相同。