Mercurial > cpython-lru_cache-weakref
diff Lib/HTMLParser.py @ 41024:963c0e442832 legacy-trunk
Patch #912410: Replace HTML entity references for attribute values
in HTMLParser.
| author | Martin v. Löwis <martin@v.loewis.de> |
|---|---|
| date | Tue, 06 Mar 2007 14:43:00 +0000 |
| parents | 15a8975f7fa9 |
| children |
line wrap: on
line diff
--- a/Lib/HTMLParser.py Tue Mar 06 13:37:45 2007 +0000 +++ b/Lib/HTMLParser.py Tue Mar 06 14:43:00 2007 +0000 @@ -358,12 +358,30 @@ self.error("unknown declaration: %r" % (data,)) # Internal -- helper to remove special character quoting + entitydefs = None def unescape(self, s): if '&' not in s: return s - s = s.replace("<", "<") - s = s.replace(">", ">") - s = s.replace("'", "'") - s = s.replace(""", '"') - s = s.replace("&", "&") # Must be last - return s + def replaceEntities(s): + s = s.groups()[0] + if s[0] == "#": + s = s[1:] + if s[0] in ['x','X']: + c = int(s[1:], 16) + else: + c = int(s) + return unichr(c) + else: + # Cannot use name2codepoint directly, because HTMLParser supports apos, + # which is not part of HTML 4 + import htmlentitydefs + if HTMLParser.entitydefs is None: + entitydefs = HTMLParser.entitydefs = {'apos':u"'"} + for k, v in htmlentitydefs.name2codepoint.iteritems(): + entitydefs[k] = unichr(v) + try: + return self.entitydefs[s] + except KeyError: + return '&'+s+';' + + return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s)
