diff --git a/lib/pure/parsexml.nim b/lib/pure/parsexml.nim
index 3b77f9c628..686aad110f 100644
--- a/lib/pure/parsexml.nim
+++ b/lib/pure/parsexml.nim
@@ -472,16 +472,19 @@ proc parseEntity(my: var XmlParser, dest: var string) =
inc(pos, 4)
else:
my.bufpos = pos
- parseName(my, dest)
+ var name = ""
+ parseName(my, name)
pos = my.bufpos
- if my.err != errNameExpected:
+ if my.err != errNameExpected and my.buf[pos] == ';':
my.kind = xmlEntity
else:
add(dest, '&')
+ add(dest, name)
if my.buf[pos] == ';':
inc(pos)
else:
- markError(my, errSemicolonExpected)
+ my.err = errSemicolonExpected
+ # do not overwrite 'my.state' here, it's a benign error
my.bufpos = pos
proc parsePI(my: var XmlParser) =
diff --git a/tests/stdlib/thtmlparser.nim b/tests/stdlib/thtmlparser.nim
index 0457585d07..ccf2f62026 100644
--- a/tests/stdlib/thtmlparser.nim
+++ b/tests/stdlib/thtmlparser.nim
@@ -2,6 +2,9 @@ discard """
output: '''
@[]
true
+https://example.com/test?format=jpg&name=orig##
+https://example.com/test?format=jpg&name=orig##text
+https://example.com/test?format=jpg##text
'''
"""
import htmlparser
@@ -136,3 +139,20 @@ block t6154:
doAssert ps[6].attr("quux") == ""
doAssert ps[6].attr("whatever") == ""
doassert ps[6].len == 0
+
+# bug #11713, #1034
+var content = """
+# with &
+
+
+
+# without &
+
+"""
+
+var
+ stream = newStringStream(content)
+ body = parseHtml(stream)
+
+for y in body.findAll("img"):
+ echo y.attr("src"), "##", y.attr("alt")