it-swarm.com.ru

Как мне удалить HTML-сущности в строке в Python 3.1?

Я осмотрел все вокруг и нашел решения только для python 2.6 и более ранних версий, НИЧЕГО, как это сделать в python 3.X. (У меня есть доступ только к Win7 box.)

Я должен иметь возможность сделать это в 3.1 и желательно без внешних библиотек. В настоящее время у меня установлен httplib2 и доступ к curl командной строки (вот как я получаю исходный код для страниц). К сожалению, curl не декодирует html-сущности, насколько я знаю, я не смог найти команду для декодирования в документации.

ДА, я пытался заставить Beautiful Soup работать, МНОГО РАЗ, но безуспешно в 3.X. Если бы вы могли предоставить EXPLICIT инструкции о том, как заставить его работать в python 3 в среде MS Windows, я был бы очень признателен.

Итак, чтобы быть ясным, мне нужно превратить строки вроде этой: Suzy & John в строку вроде этой: "Сьюзи и Джон".

55
VolatileRig

Вы можете использовать функцию html.unescape :

В Python3.4 + (спасибо J.F. Sebastian за обновление):

import html
html.unescape('Suzy & John')
# 'Suzy & John'

html.unescape('"')
# '"'

В Python3.3 или старше:

import html.parser    
html.parser.HTMLParser().unescape('Suzy & John')

В Python2 :

import HTMLParser
HTMLParser.HTMLParser().unescape('Suzy & John')
154
unutbu

Вы можете использовать xml.sax.saxutils.unescape для этой цели. Этот модуль включен в стандартную библиотеку Python и ​​переносим между Python 2.x и Python 3.x.

>>> import xml.sax.saxutils as saxutils
>>> saxutils.unescape("Suzy & John")
'Suzy & John'
13
Greg Hewgill

Очевидно, у меня недостаточно высокая репутация, чтобы что-то делать, кроме как опубликовать это. Ответ Unutbu не отменяет цитаты. Единственное, что я обнаружил, это функция:

import re
from htmlentitydefs import name2codepoint as n2cp

def decodeHtmlentities(string):
    def substitute_entity(match):        
        ent = match.group(2)
        if match.group(1) == "#":
            return unichr(int(ent))
        else:
            cp = n2cp.get(ent)
            if cp:
                return unichr(cp)
            else:
                return match.group()
    entity_re = re.compile("&(#?)(\d{1,5}|\w{1,8});")
    return entity_re.subn(substitute_entity, string)[0]

Что я получил от этого страница .

6
Derrick Petzold

В Python 3.x тоже есть html.entities

3
YOU

В моем случае у меня есть html строка, экранированная в escape-функции as3. После часа поиска в Google ничего полезного не нашел, поэтому я написал эту функцию recusrive для своих нужд. Вот,

def unescape(string):
    index = string.find("%")
    if index == -1:
        return string
    else:
        #if it is escaped unicode character do different decoding
        if string[index+1:index+2] == 'u':
            replace_with = ("\\"+string[index+1:index+6]).decode('unicode_escape')
            string = string.replace(string[index:index+6],replace_with)
        else:
            replace_with = string[index+1:index+3].decode('hex')
            string = string.replace(string[index:index+3],replace_with)
        return unescape(string)

Edit-1 Добавлена ​​функциональность для обработки символов Юникода.

2
Simanas

Я не уверен, является ли это встроенной библиотекой или нет, но похоже, что вам нужно и поддерживает 3.1.

От: http://docs.python.org/3.1/library/xml.sax.utils.html?highlight=html%20unescape

xml.sax.saxutils.unescape (data, entity = {}) Unescape '&', '<' и '>' в строке данных.

1
TheJacobTaylor