]> git.phdru.name Git - bookmarks_db.git/blobdiff - Robots/parse_html.py
Some sites put TITLE in HTML outside of HEAD.
[bookmarks_db.git] / Robots / parse_html.py
index c5c9eb6831e0db333cf95cd25314dbc453a5e28a..9f924c49597a3f4436fd477363ee7cd1fe1b5c32 100755 (executable)
@@ -30,7 +30,10 @@ def recode_entities(title, charset):
    output = []
    for part in entity_re.split(title):
       if entity_re.match(part):
-         part = unichr(int(part[2:-1])).encode(charset, "replace")
+         try:
+            part = unichr(int(part[2:-1])).encode(charset)
+         except UnicodeEncodeError:
+            pass # Leave the entity as is
       output.append(part)
 
    return ''.join(output)
@@ -50,7 +53,7 @@ def parse_html(filename, charset=None, log=None):
       else:
          if log: log("Parser %s.%s failed, trying next one." % (p.__module__, p.__name__))
 
-   title = parser.title
+   converted_title = title = parser.title
    if not parser.charset:
       try:
          unicode(title, "ascii")
@@ -70,23 +73,26 @@ def parse_html(filename, charset=None, log=None):
          if log: log("   title          : %s" % title)
          save_title = title
          try:
-            title = unicode(title, parser.charset).encode(current_charset)
+            converted_title = unicode(title, parser.charset).encode(current_charset)
          except UnicodeError:
             if parser.meta_charset and parser.charset.endswith("1252") and \
                   not DEFAULT_CHARSET.endswith("1252") and (DEFAULT_CHARSET <> current_charset):
                parser.charset = DEFAULT_CHARSET
                if log: log("   incorrect conversion from cp1252, converting from %s" % DEFAULT_CHARSET)
-               title = unicode(save_title, DEFAULT_CHARSET, "replace").encode(current_charset, "replace")
+               converted_title = unicode(save_title, DEFAULT_CHARSET, "replace").encode(current_charset, "replace")
             else:
-               title = unicode(title, parser.charset, "replace").encode(current_charset, "replace")
-         if log: log("   converted title: %s" % title)
+               converted_title = unicode(title, parser.charset, "replace").encode(current_charset, "replace")
+         if log and (converted_title <> title): log("   converted title: %s" % converted_title)
       except LookupError:
          if log: log("   unknown charset: `%s' or `%s'" % (parser.charset, current_charset))
-
-   title = recode_entities(title, current_charset)
-   title = title.replace('\r', '').replace('\n', ' ').strip()
-   if log: log("   final title    : %s" % title)
-   parser.title = title
+   else:
+      if log: log("   title          : %s" % title)
+
+   final_title = recode_entities(converted_title, current_charset)
+   parts = [s.strip() for s in final_title.replace('\r', '').split('\n')]
+   final_title = ' '.join([s for s in parts if s])
+   if log and (final_title <> converted_title): log("   final title    : %s" % final_title)
+   parser.title = final_title
    return parser