Index: tracdarcs/changesparser.py
===================================================================
--- tracdarcs/changesparser.py	(revision 183)
+++ tracdarcs/changesparser.py	(revision 196)
@@ -120,19 +120,37 @@
                 self.patches.append(patch)
 
-    from string import maketrans
-    tt = maketrans(BADCHARS, "-"*len(BADCHARS))
-    changes = changes.translate(tt)
-
     handler = SAXHandler()
     try:
         parseString(changes, handler)
     except SAXParseException, e:
+        # Retry, after removing badchars from the input
+
         lines = changes.splitlines()
-        line = lines[e._linenum-1]
-        log.critical("Cannot complete the parse of the XML output due to a SAX Error, "
-                     "on the changeset %d: %s", len(handler.patches), e)
-        log.warning("%s", line)
         if e._colnum:
-            log.warning('-'*(e._colnum-1)+'^'*5)
+            line = lines[e._linenum-1][:e._colnum+35]
+            pointer = '\nhere: ' + '-'*(e._colnum-1) + '^'*5
+        else:
+            line = lines[e._linenum-1][:60]
+            pointer = ''
+        log.warning("SAX couldn't parse the XML changes stream "
+                    "due to an error at line %d on changeset "
+                    "%d: %s\ntext: %s%s\n"
+                    "Replacing bad characters with a hyphen "
+                    "and retrying...",
+                    e._linenum, len(handler.patches), e,
+                    repr(line)[1:-1], pointer)
+
+        from string import maketrans
+        tt = maketrans(BADCHARS, "-"*len(BADCHARS))
+        changes = changes.translate(tt)
+
+        handler = SAXHandler()
+        try:
+            parseString(changes, handler)
+        except SAXParseException, e:
+            log.critical("Sorry, the substitution didn't help, giving up!")
+        else:
+            log.warning("... the replacement did the trick, going on!")
+
     return handler.patches
 
