2010-03-02 2 views
38

Я просмотрел все вокруг и нашел решения для python 2.6 и ранее, НИЧЕГО, как это сделать в python 3.X. (У меня есть доступ только к коробке Win7.)Как удалить объекты HTML в строке в Python 3.1?

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

ДА, Я попытался заставить Красивый суп работать, МНОГО ВРЕМЕНИ без успеха в 3.X. Если бы вы могли предоставить инструкции EXPLICIT о том, как заставить его работать на python 3 в среде MS Windows, я был бы очень благодарен.

Итак, чтобы быть ясным, мне нужно повернуть строки следующим образом: Suzy & John в строку типа «Suzy & John».

ответ

121

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

В Python3.4 + (спасибо JF Sebastian для обновления):

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

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

In Python3.3 и старше:

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

В Python2:

import HTMLParser 
HTMLParser.HTMLParser().unescape('Suzy & John') 
+0

Awesome! Тем не менее, я вижу, что только отменяет определенные символы. Например, амперсанд остается скрытым. Не могли бы вы объяснить, почему это? Как отключить эти символы? –

+0

@Sho Minamimoto: Я добавил пример. Надеюсь, поможет? – unutbu

+0

Да, я понял, спасибо! –

11

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

>>> import xml.sax.saxutils as saxutils 
>>> saxutils.unescape("Suzy & John") 
'Suzy & John' 
+0

Кажется, что он неполный, '& euml' не расшифровывается с этим, хотя он работает с htmlparser – bcoughlan

6

По-видимому, у меня нет достаточно высокой репутации, чтобы делать что-либо, кроме как опубликовать это. Ответ 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] 

Что я получил от этого page.

2

В моем случае у меня есть строка html, экранированная в as3 escape-функции. После часа поиска в 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 функциональность Добавлена ​​для обработки символов Юникода.

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