Кодировать Декодирование строк python

У меня есть список html-страниц, которые могут содержать определенные закодированные символы. Некоторые примеры приведены ниже:

<a href="mailto:lad%20at%20maestro%20dot%20com"> <em>ada@graphics.maestro.com</em> <em>mel@graphics.maestro.com</em> 

Я хотел бы расшифровать (бежать, я не уверен в текущей терминологии) эти строки –

  <a href="mailto:lad at maestro dot com"> <em>ada@graphics.maestro.com</em> <em>mel@graphics.maestro.com</em> 

Обратите внимание: страницы HTML находятся в строчном формате. Кроме того, я НЕ хочу использовать какую-либо внешнюю библиотеку, такую ​​как BeautifulSoup или lxml, только собственные библиотеки python в порядке.

Изменить

Решение ниже не идеально. Устранение HTML-парсера с помощью urllib2 бросает

 UnicodeDecodeError: 'ascii' codec can't decode byte 0x94 in position 31: ordinal not in range(128) 

ошибка в некоторых случаях.

Вам нужно unescape HTML-сущности и URL-unquote.
Стандартная библиотека имеет HTMLParser и urllib2 чтобы помочь с этими задачами.

 import HTMLParser, urllib2 markup = '''<a href="mailto:lad%20at%20maestro%20dot%20com"> <em>ada&#x40;graphics.maestro.com</em> <em>mel&#x40;graphics.maestro.com</em>''' result = HTMLParser.HTMLParser().unescape(urllib2.unquote(markup)) for line in result.split("\n"): print(line) 

Результат:

 <a href="mailto:lad at maestro dot com"> <em>ada@graphics.maestro.com</em> <em>mel@graphics.maestro.com</em> 

Редактировать:
Если ваши страницы могут содержать символы, отличные от ASCII, вам необходимо позаботиться о декодировании ввода и кодировании на выходе.
Загруженный образец файла имеет набор символов, установленный на cp-1252 , поэтому давайте попробуем декодировать его в Unicode:

 import codecs with codecs.open(filename, encoding="cp1252") as fin: decoded = fin.read() result = HTMLParser.HTMLParser().unescape(urllib2.unquote(decoded)) with codecs.open('/output/file.html', 'w', encoding='cp1252') as fou: fou.write(result) 

Edit2:
Если вам не нравятся символы, отличные от ASCII, вы можете немного упростить:

 with open(filename) as fin: decoded = fin.read().decode('ascii','ignore') ...