代码之家  ›  专栏  ›  技术社区  ›  rg88

一些基本的python问题

  •  5
  • rg88  · 技术社区  · 15 年前

    我是个十足的巨蟒笨蛋,所以请容忍我。我想让python扫描一页HTML,并用与utf-8兼容的东西替换Microsoft Word实体的实例。

    我的问题是,你是如何在python中做到这一点的(我在谷歌上搜索过这个,但到目前为止还没有找到明确的答案)?我想把我的脚趾浸在巨蟒水里,所以我觉得像这样简单的事情是个不错的开始。看来我需要:

    1. 将从MS Word粘贴的文本加载到变量中
    2. 对内容运行某种替换函数
    3. 输出它

    在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); 
    

    你会怎么用蟒蛇呢?

    编辑:嗯,好吧,暂时忽略我对UTF-8和实体的混淆。输入包含从MS Word粘贴的文本。像花引号这样的东西显示为奇怪的符号。我尝试修复的各种PHP函数并没有给出我想要的结果。通过在十六进制编辑器中查看这些奇怪的符号,我看到它们对应于我上面使用的符号(0xe2、0x80等)。所以我简单地用HTML实体替换了奇怪的字符。因此,如果上面的位已经是utf-8,那么从ms-word中粘贴什么会导致奇怪的符号?

    伊迪丝2:所以我开始学习一些关于Python的知识,发现我不太懂编码。我试图解决的问题可以通过从头到尾进行独立编码来解决。如果输入表单是utf-8,那么存储输入的数据库是utf-8,输出它的页面是utf-8…从Word粘贴效果良好。无需特殊功能。现在,关于学习小蟒蛇…

    4 回复  |  直到 15 年前
        1
  •  20
  •   Miles    15 年前

    首先,这些不是微软Word实体 UTF-8。您正在将它们转换为HTML实体。

    写东西的方式就像:

    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格式,那么就坚持使用数字实体实际上不需要使用命名实体。

        2
  •  3
  •   S.Lott    15 年前

    python代码具有相同的轮廓。

    只需用python isms替换所有php isms。

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

        3
  •  2
  •   Matt Good    15 年前

    清除Word HTML的最佳选择是使用 HTML Tidy 它有一个模式。有 a few Python wrappers 如果需要以编程方式进行,可以使用。

        4
  •  1
  •   hbw    15 年前

    正如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)
    

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