【问题标题】:Some Basic Python Questions一些基本的 Python 问题
【发布时间】:2009-04-16 01:41:41
【问题描述】:

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

我的问题是,您如何在 Python 中做到这一点(我已经在 Google 上搜索过,但到目前为止还没有找到明确的答案)?我想涉足 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); 

你会如何在 Python 中做到这一点?

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

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

【问题讨论】:

  • +1: "defangWord()"...我喜欢它! :-)

标签: php python unicode replace html-entities


【解决方案1】:

首先,它们不是 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 for xmlcharrefreplace — 今天真的不需要 HTML 命名实体。但实际上,不要管 UTF-8,智能引号完好无损。只要您使用正确的“字符集”标题/元标记来提供它,就没有问题。
  • +1 指出实体是 UTF-8 而不是一些 MS 怪异 ;-) (以及整体上写得很好的答案)
  • 我很困惑。我在示例中导入的文档充满了对应于 MS Word 大引号的奇怪符号。如果我将它们直接放入使用 UTF-8 编码的页面中,我会得到奇怪的符号。如果我使用我的示例代码转换它们,它们会很好地呈现。那么,在我转换之前它们是什么?
  • 当您说“将它们直接放入使用 UTF-8 编码的页面”时,很难说出您的意思。听起来您正在使用不正确的字符集(可能是 Windows-1252)在文本编辑器中打开 test100.html 文件——确保以 UTF-8 格式打开它。
  • 抱歉,不清楚。我编写的 PHP 是为了处理人们直接从 Word 粘贴到文本区域而创建的。然后粘贴的代码会出现乱码(例如,看起来像“Inside Quotes”),我找不到清理它的好方法。我上面的代码清理了它。
【解决方案2】:

Python 代码具有相同的轮廓。

只需用 Python-isms 替换所有 PHP-isms。

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

【讨论】:

    【解决方案3】:

    清理 Word HTML 的最佳选择是使用 HTML Tidy,它有专门的模式。如果您需要以编程方式进行操作,可以使用 a few Python wrappers

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • @Justus,file(name).read() 不会泄漏文件描述符,因为您从不调用 close?
      猜你喜欢
      • 2018-02-14
      • 1970-01-01
      • 2011-04-14
      • 2012-05-18
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多