diff --git a/test/test_compat.py b/test/test_compat.py
index 2b0860479e..834f4bc552 100644
--- a/test/test_compat.py
+++ b/test/test_compat.py
@@ -74,9 +74,10 @@ class TestCompat(unittest.TestCase):
self.assertEqual(compat_shlex_split('-option "one two"'), ['-option', 'one two'])
def test_compat_etree_fromstring(self):
- xml = ''
+ xml = ''
doc = compat_etree_fromstring(xml.encode('utf-8'))
self.assertTrue(isinstance(doc.attrib['foo'], compat_str))
+ self.assertTrue(isinstance(doc.attrib['spam'], compat_str))
if __name__ == '__main__':
unittest.main()
diff --git a/youtube_dl/compat.py b/youtube_dl/compat.py
index cf10835ca5..f39d4e9a9e 100644
--- a/youtube_dl/compat.py
+++ b/youtube_dl/compat.py
@@ -216,8 +216,7 @@ except ImportError: # Python 2.6
if sys.version_info[0] >= 3:
compat_etree_fromstring = xml.etree.ElementTree.fromstring
else:
- # on python 2.x the the attributes of a node are str objects instead of
- # unicode
+ # on python 2.x the the attributes of a node aren't always unicode objects
etree = xml.etree.ElementTree
# on 2.6 XML doesn't have a parser argument, function copied from CPython
@@ -231,7 +230,8 @@ else:
def _element_factory(*args, **kwargs):
el = etree.Element(*args, **kwargs)
for k, v in el.items():
- el.set(k, v.decode('utf-8'))
+ if isinstance(v, bytes):
+ el.set(k, v.decode('utf-8'))
return el
def compat_etree_fromstring(text):