diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index 4e161ca2f3a..4f06d20c045 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -1769,6 +1769,16 @@ def bug_200709_iter_comment():
"""
+def bug_18347():
+ """
+
+ >>> e = ET.XML('text')
+ >>> serialize(e)
+ 'text'
+ >>> serialize(e, method="html")
+ 'text'
+ """
+
# --------------------------------------------------------------------
# reported on bugs.python.org
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
index bb468cde698..9f3e75d4a6f 100644
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -988,15 +988,15 @@ def _serialize_html(write, elem, encoding, qnames, namespaces):
# FIXME: handle boolean attributes
write(" %s=\"%s\"" % (qnames[k], v))
write(">")
- tag = tag.lower()
+ ltag = tag.lower()
if text:
- if tag == "script" or tag == "style":
+ if ltag == "script" or ltag == "style":
write(_encode(text, encoding))
else:
write(_escape_cdata(text, encoding))
for e in elem:
_serialize_html(write, e, encoding, qnames, None)
- if tag not in HTML_EMPTY:
+ if ltag not in HTML_EMPTY:
write("" + tag + ">")
if elem.tail:
write(_escape_cdata(elem.tail, encoding))
diff --git a/Misc/NEWS b/Misc/NEWS
index fec41b73424..8114b696af8 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,9 @@ Core and Builtins
Library
-------
+- Issue #18347: ElementTree's html serializer now preserves the case of
+ closing tags.
+
- Issue #17261: Ensure multiprocessing's proxies use proper address.
- Issue #17097: Make multiprocessing ignore EINTR.