summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSenthil Kumaran <orsenthil@gmail.com>2010-12-28 15:55:16 (GMT)
committerSenthil Kumaran <orsenthil@gmail.com>2010-12-28 15:55:16 (GMT)
commit164540fee1f5909364e0758bbb948ee6f7387f14 (patch)
tree1b8e4bac5472f3c350384e3c6daa293dbfae17c5
parent3b4499c5c7718a2aca8558b857dfe02cc4a80cd9 (diff)
downloadcpython-164540fee1f5909364e0758bbb948ee6f7387f14.zip
cpython-164540fee1f5909364e0758bbb948ee6f7387f14.tar.gz
cpython-164540fee1f5909364e0758bbb948ee6f7387f14.tar.bz2
Fix Issue10759 - html.parser.unescape() fails on HTML entities with incorrect syntax
-rw-r--r--Lib/html/parser.py17
-rw-r--r--Lib/test/test_htmlparser.py5
2 files changed, 15 insertions, 7 deletions
diff --git a/Lib/html/parser.py b/Lib/html/parser.py
index 8d275ab..21ebbc3 100644
--- a/Lib/html/parser.py
+++ b/Lib/html/parser.py
@@ -434,13 +434,16 @@ class HTMLParser(_markupbase.ParserBase):
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 chr(c)
+ try:
+ if s[0] == "#":
+ s = s[1:]
+ if s[0] in ['x','X']:
+ c = int(s[1:], 16)
+ else:
+ c = int(s)
+ return chr(c)
+ except ValueError:
+ return '&#'+ s +';'
else:
# Cannot use name2codepoint directly, because HTMLParser
# supports apos, which is not part of HTML 4
diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py
index beaf6b6..5ecd016 100644
--- a/Lib/test/test_htmlparser.py
+++ b/Lib/test/test_htmlparser.py
@@ -356,6 +356,11 @@ class HTMLParserTolerantTestCase(TestCaseBase):
[('action', 'bogus|&#()value')])],
collector = self.collector)
+ def test_unescape_function(self):
+ p = html.parser.HTMLParser()
+ self.assertEqual(p.unescape('&#bad;'),'&#bad;')
+ self.assertEqual(p.unescape('&#0038;'),'&')
+
def test_main():
support.run_unittest(HTMLParserTestCase, HTMLParserTolerantTestCase)