2009-04-16 4 views
5

Я полный питон noob, поэтому, пожалуйста, несите меня. Я хочу, чтобы python просматривал страницу html и заменял экземпляры объектов Microsoft Word чем-то совместимым с UTF-8.Некоторые основные вопросы Python

Мой вопрос в том, как вы это делаете в Python (у меня это было в Googled, но пока не найдено четкого ответа)? Я хочу окунуть мой палец в воды Питона, поэтому я считаю, что что-то простое, так как это хорошее место для начала. Кажется, что я должен был бы:

  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?

EDIT: Хм, хорошо игнорируйте мое замешательство относительно UTF-8 и сущностей на данный момент. Ввод содержит текст, вставленный из MS Word. Такие вещи, как фигурные кавычки, отображаются как нечетные символы. Различные функции PHP, которые я использовал, чтобы исправить, не дали мне результатов, которые я хотел. Просмотрев эти нечетные символы в шестнадцатеричном редакторе, я увидел, что они соответствуют символам, которые я использовал выше (0xe2, 0x80 и т. Д.). Поэтому я просто поменял символы с нечетным символом на объекты HTML. Итак, если бит, который у меня выше, есть UTF-8, то, что вставлено из MS Word, которое вызывает нечетные символы?

EDIT2: Итак, я решил немного узнать о Python и нашел, что я действительно не понимаю кодировку. Проблема, которую я пыталась решить, может быть решена просто за счет наличия непоследовательной кодировки от конца до конца. Если входной формой является UTF-8, база данных, в которой хранится вход, - UTF-8, а страница, которая выводит ее, - UTF-8 ... вставка из Word работает нормально. Никаких специальных функций не требуется. Теперь об обучении небольшому Python ...

+1

+1: "defangWord()" ... Мне это нравится! :-) –

ответ

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; ситуация с Unicode сильно отличается для Python 3+.

Я также согласен с комментарием bobince ниже: если вы можете просто сохранить текст в формате UTF-8 и отправить его с правильным типом контента и кодировкой, сделайте это; если вам нужно, чтобы он был в ASCII, тогда придерживайтесь числовых сущностей - нет необходимости использовать именованные.

+0

+1 для xmlcharrefreplace - сегодня нет необходимости в HTML-именах объектов. Но на самом деле, оставите UTF-8 в одиночку, смарт-цитаты нетронутыми. Пока вы обслуживаете его с правильным заголовком/метатегом charset, нет проблем. – bobince

+0

+1 для указания, что сущности UTF-8, а не некоторые странности MS ;-) (и для хорошо написанного ответа в целом тоже) –

+0

Я в замешательстве. Документ, который я импортирую в примере, заполнен странными символами, которые соответствуют кубическим цитатам из MS Word. Если я выложу их прямо на страницу с кодировкой UTF-8, я получаю странные символы. Если я их конвертирую, используя мой примерный код, они выглядят отлично. Итак, каковы они до того, как я конвертирую? – Stuart

3

Код Python имеет одинаковую схему.

Просто замените все PHP-isms на Python-isms.

Начните с создания объекта File. Результатом файла file.read() является объект string. Строки имеют операцию «заменить».

2

Ваш лучший выбор для очистки Word HTML использует HTML Tidy, который имеет режим только для этого. Есть a few Python wrappers, которые вы можете использовать, если вам нужно сделать это программно.

1

Как сказал С.Лотт, код Python был бы очень и очень похож - единственными отличиями по существу были бы вызовы/утверждения функции.

Я не думаю, что Python имеет прямой эквивалент file_get_contents(), но так как вы можете получить массив строк в файле, вы можете присоединиться к ним при помощи перевода строки, например:

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

EDIT : Ничего, есть гораздо более простой способ: sample = file(test).read()

Строка замены почти точно так же, как str_replace():

sample = sample.replace(search, replace) 

и выводящий так же просто, как print заявление:

print defang_word(sample) 

Так как вы можете видеть, эти две версии выглядят почти точно так же.

+0

file ('foo.txt'). Read() – Justus

+0

Хорошо отредактирован. – hbw

+0

@Justus, не будет 'file (name) .read()' дескрипторы файла утечки, так как вы никогда не вызываете close? –

Смежные вопросы