diff --git a/src/calibre/ebooks/oeb/polish/tests/parsing.py b/src/calibre/ebooks/oeb/polish/tests/parsing.py
index c60bfa1f42..428dc12b8d 100644
--- a/src/calibre/ebooks/oeb/polish/tests/parsing.py
+++ b/src/calibre/ebooks/oeb/polish/tests/parsing.py
@@ -29,7 +29,7 @@ def nonvoid_cdata_elements(test, parse_function):
root = parse_function(markup.format(x))
test.assertEqual(
len(XPath('//h:body[@id="test"]')(root)), 1,
- 'Incorrect parsing for <%s/>, parsed markup:\n' % x + etree.tostring(root))
+ 'Incorrect parsing for <%s/>, parsed markup:\n' % x + etree.tostring(root, encoding='unicode'))
def namespaces(test, parse_function):
@@ -44,7 +44,7 @@ def namespaces(test, parse_function):
root = parse_function(markup)
ae(
len(XPath('//h:body[@id="test"]')(root)), 1,
- 'Incorrect parsing, parsed markup:\n' + etree.tostring(root))
+ 'Incorrect parsing, parsed markup:\n' + etree.tostring(root, encoding='unicode'))
match_and_prefix(root, '//h:body[@id="test"]', None)
markup = '''
@@ -52,7 +52,7 @@ def namespaces(test, parse_function):
'''.format(xhtml=XHTML_NS, svg=SVG_NS, xlink=XLINK_NS)
root = parse_function(markup)
- err = 'Incorrect parsing, parsed markup:\n' + etree.tostring(root)
+ err = 'Incorrect parsing, parsed markup:\n' + etree.tostring(root, encoding='unicode')
match_and_prefix(root, '//h:body[@id="test"]', None, err)
match_and_prefix(root, '//svg:svg', 'svg', err)
match_and_prefix(root, '//svg:image[@xl:href]', 'svg', err)
@@ -62,14 +62,14 @@ def namespaces(test, parse_function):
'''.format(xhtml=XHTML_NS, svg=SVG_NS, xlink=XLINK_NS)
root = parse_function(markup)
- err = 'Incorrect parsing, parsed markup:\n' + etree.tostring(root)
+ err = 'Incorrect parsing, parsed markup:\n' + etree.tostring(root, encoding='unicode')
match_and_prefix(root, '//h:body[@id="test"]', None, err)
match_and_prefix(root, '//svg:svg', None, err)
match_and_prefix(root, '//svg:image[@xl:href]', None, err)
markup = '
'
root = parse_function(markup)
- err = 'Namespaces not created, parsed markup:\n' + etree.tostring(root)
+ err = 'Namespaces not created, parsed markup:\n' + etree.tostring(root, encoding='unicode')
match_and_prefix(root, '//svg:svg', None, err)
match_and_prefix(root, '//svg:image[@xl:href]', None, err)
if parse_function is parse:
@@ -77,7 +77,7 @@ def namespaces(test, parse_function):
ae(image.nsmap, {'xlink':XLINK_NS, None:SVG_NS})
root = parse_function('')
- err = 'Multiple HTML tags not handled, parsed markup:\n' + etree.tostring(root)
+ err = 'Multiple HTML tags not handled, parsed markup:\n' + etree.tostring(root, encoding='unicode')
match_and_prefix(root, '//h:html', None, err)
match_and_prefix(root, '//h:html[@lang]', None, err)
match_and_prefix(root, '//h:html[@id]', None, err)
@@ -85,12 +85,12 @@ def namespaces(test, parse_function):
# if parse_function is not html5_parse:
# markup = ''.format(html=XHTML_NS)
# root = parse_function(markup)
- # err = 'HTML namespace prefixed, parsed markup:\n' + etree.tostring(root)
+ # err = 'HTML namespace prefixed, parsed markup:\n' + etree.tostring(root, encoding='unicode')
# match_and_prefix(root, '//h:html', None, err)
markup = ''
root = parse_function(markup)
- err = 'Arbitrary namespaces not preserved, parsed markup:\n' + etree.tostring(root)
+ err = 'Arbitrary namespaces not preserved, parsed markup:\n' + etree.tostring(root, encoding='unicode')
def xpath(expr):
return etree.XPath(expr, namespaces={'ns1':'NS', 'ns2':'NS2'})(root)
@@ -105,7 +105,7 @@ def namespaces(test, parse_function):
markup = ''
root = parse_function(markup)
- err = 'xml:lang not converted to lang, parsed markup:\n' + etree.tostring(root)
+ err = 'xml:lang not converted to lang, parsed markup:\n' + etree.tostring(root, encoding='unicode')
ae(len(root.xpath('//*[@lang="en"]')), 2, err)
ae(len(root.xpath('//*[@lang="de"]')), 1, err)
ae(len(root.xpath('//*[@lang="es"]')), 1, err)
@@ -115,7 +115,7 @@ def namespaces(test, parse_function):
def space_characters(test, parse_function):
markup = '
\u000cX
'
root = parse_function(markup)
- err = 'form feed character not converted, parsed markup:\n' + etree.tostring(root)
+ err = 'form feed character not converted, parsed markup:\n' + etree.tostring(root, encoding='unicode')
test.assertNotIn('\u000c', root.xpath('//*[local-name()="p"]')[0].text, err)
markup = 'a\u000b\u000c
'
root = parse_function(markup) # Should strip non XML safe control code \u000b
@@ -126,21 +126,21 @@ def space_characters(test, parse_function):
def case_insensitive_element_names(test, parse_function):
markup = '
'
root = parse_function(markup)
- err = 'case sensitive parsing, parsed markup:\n' + etree.tostring(root)
+ err = 'case sensitive parsing, parsed markup:\n' + etree.tostring(root, encoding='unicode')
test.assertEqual(len(XPath('//h:p')(root)), 1, err)
def entities(test, parse_function):
markup = ' '
'
root = parse_function(markup)
- err = 'Entities not handled, parsed markup:\n' + etree.tostring(root)
+ err = 'Entities not handled, parsed markup:\n' + etree.tostring(root, encoding='unicode')
test.assertEqual('\xa0\'', root.xpath('//*[local-name()="p"]')[0].text, err)
def multiple_html_and_body(test, parse_function):
markup = '
'
root = parse_function(markup)
- err = 'multiple html and body not handled, parsed markup:\n' + etree.tostring(root)
+ err = 'multiple html and body not handled, parsed markup:\n' + etree.tostring(root, encoding='unicode')
test.assertEqual(len(XPath('//h:html')(root)), 1, err)
test.assertEqual(len(XPath('//h:body')(root)), 1, err)
test.assertEqual(len(XPath('//h:html[@id and @lang]')(root)), 1, err)
@@ -150,7 +150,7 @@ def multiple_html_and_body(test, parse_function):
def attribute_replacement(test, parse_function):
markup = '