[Python-checkins] r54165 - in python/trunk: Doc/lib/libhtmlparser.tex Lib/HTMLParser.py Lib/test/test_htmlparser.py Misc/NEWS
martin.v.loewis
python-checkins at python.org
Tue Mar 6 15:43:01 CET 2007
Author: martin.v.loewis
Date: Tue Mar 6 15:43:00 2007
New Revision: 54165
Modified:
python/trunk/Doc/lib/libhtmlparser.tex
python/trunk/Lib/HTMLParser.py
python/trunk/Lib/test/test_htmlparser.py
python/trunk/Misc/NEWS
Log:
Patch #912410: Replace HTML entity references for attribute values
in HTMLParser.
Modified: python/trunk/Doc/lib/libhtmlparser.tex
==============================================================================
--- python/trunk/Doc/lib/libhtmlparser.tex (original)
+++ python/trunk/Doc/lib/libhtmlparser.tex Tue Mar 6 15:43:00 2007
@@ -75,14 +75,18 @@
be overridden by a derived class; the base class implementation does
nothing.
-The \var{tag} argument is the name of the tag converted to
-lower case. The \var{attrs} argument is a list of \code{(\var{name},
-\var{value})} pairs containing the attributes found inside the tag's
-\code{<>} brackets. The \var{name} will be translated to lower case
-and double quotes and backslashes in the \var{value} have been
-interpreted. For instance, for the tag \code{<A
-HREF="http://www.cwi.nl/">}, this method would be called as
+The \var{tag} argument is the name of the tag converted to lower case.
+The \var{attrs} argument is a list of \code{(\var{name}, \var{value})}
+pairs containing the attributes found inside the tag's \code{<>}
+brackets. The \var{name} will be translated to lower case, and quotes
+in the \var{value} have been removed, and character and entity
+references have been replaced. For instance, for the tag \code{<A
+ HREF="http://www.cwi.nl/">}, this method would be called as
\samp{handle_starttag('a', [('href', 'http://www.cwi.nl/')])}.
+
+\versionchanged[All entity references from htmlentitydefs are now
+replaced in the attribute values]{2.6}
+
\end{methoddesc}
\begin{methoddesc}{handle_startendtag}{tag, attrs}
Modified: python/trunk/Lib/HTMLParser.py
==============================================================================
--- python/trunk/Lib/HTMLParser.py (original)
+++ python/trunk/Lib/HTMLParser.py Tue Mar 6 15:43:00 2007
@@ -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)
Modified: python/trunk/Lib/test/test_htmlparser.py
==============================================================================
--- python/trunk/Lib/test/test_htmlparser.py (original)
+++ python/trunk/Lib/test/test_htmlparser.py Tue Mar 6 15:43:00 2007
@@ -309,6 +309,11 @@
("endtag", "script"),
])
+ def test_entityrefs_in_attributes(self):
+ self._run_check("<html foo='€&aa&unsupported;'>", [
+ ("starttag", "html", [("foo", u"\u20AC&aa&unsupported;")])
+ ])
+
def test_main():
test_support.run_unittest(HTMLParserTestCase)
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS (original)
+++ python/trunk/Misc/NEWS Tue Mar 6 15:43:00 2007
@@ -141,6 +141,9 @@
Library
-------
+- Patch #912410: Replace HTML entity references for attribute values
+ in HTMLParser.
+
- Patch #1663234: you can now run doctest on test files and modules
using "python -m doctest [-v] filename ...".
More information about the Python-checkins
mailing list