2009-03-19 11 views
12

Czy ktoś wie w Pythonie prosty sposób przekształcania ciągu znaków z kodami jednostek HTML (na przykład &lt;&amp;) w zwykły ciąg znaków (np. < &)?Kody jednostek HTML do tekstu

cgi.escape() będzie uciec struny (słabo), ale nie ma unescape().

Odpowiedz

37

ma funkcjonalność w bibliotece standardowej. To jest, niestety, nieudokumentowane:

(python2 Docs)

>>> import HTMLParser 
>>> h= HTMLParser.HTMLParser() 
>>> h.unescape('alpha &lt; &beta;') 
u'alpha < \u03b2' 

(Python 3 Docs)

>>> import html.parser 
>>> h = html.parser.HTMLParser() 
>>> h.unescape('alpha &lt; &beta;') 
'alpha < \u03b2' 

htmlentitydefs jest udokumentowane, ale wymaga, aby zrobić wiele prac samodzielnie.

Jeśli potrzebujesz tylko predefiniowanych jednostek XML (lt, gt, amp, quot, apos), możesz użyć minidom do ich analizy. Jeśli potrzebujesz tylko predefiniowanych elementów i żadnych odnośników liczbowych, możesz nawet użyć zwykłego starego ciągu zastępującego prędkość.

+1

+1 Nie wiedziałem, że funkcja HTMLParser – vartec

+2

Oto udokumentowana funkcja ze standardowej biblioteki, która zamieni kod z hasłem HTML na normalny ciąg: http://docs.python.org/library/xml.sax. utils.html # xml.sax.saxutils.unescape –

+0

W Pythonie 3.4 jest [udokumentowane] (https://docs.python.org/3/library/html.html#html.unescape). – 9000

1

Użyj modułu htmlentitydefs. To mój stary kod, to działa, ale jestem pewien, że jest czystsze i bardziej pythonic sposób to zrobić:

e2c = dict(('&%s;'%k,eval("u'\\u%04x'"%v)) for k, v in htmlentitydefs.name2codepoint.items()) 
12

zapomniałem oznaczyć go na początku, ale używam BeautifulSoup.

Kopanie wokół w dokumentacji znalazłem:

soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES) 

robi to dokładnie tak, jak miałem nadzieję.

+4

Działa to tylko w przypadku wersji BeautifulSoup wersji wcześniejszej niż BS4. Jeśli używasz BS4, musisz użyć formatyzatora: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#output-formatters – kronion

+2

to nie działa dla & Właściwie, jeśli ciąg zawiera "&" , BeautifulSoup zamienia go z powrotem na &, co jest przeciwieństwem tego, co miałem nadzieję. –

Powiązane problemy