]> git.phdru.name Git - bookmarks_db.git/blobdiff - Robots/parse_html.py
Timout can be float.
[bookmarks_db.git] / Robots / parse_html.py
index 3e20a5516a775eb8e425bdf932831bbcb559641f..96022b07335f2ddc487f1eaea87d29f54acd5345 100755 (executable)
@@ -11,10 +11,16 @@ from m_lib.defenc import default_encoding
 current_charset = default_encoding.replace("windows-", "cp")
 DEFAULT_CHARSET = "cp1251" # Stupid default for Russian Cyrillic
 
+parsers = []
 try:
-   from parse_html_beautifulsoup import parse_html as _parse_html
+   from parse_html_beautifulsoup import parse_html
 except ImportError:
-   from parse_html_htmlparser import parse_html as _parse_html
+   pass
+else:
+   parsers.append(parse_html)
+
+from parse_html_htmlparser import parse_html
+parsers.append(parse_html)
 
 
 import re
@@ -37,9 +43,14 @@ def parse_html(filename, charset=None, log=None):
       except (ValueError, LookupError):
          charset = None         # ...try charset from HTML
 
-   parser = _parse_html(filename, charset)
-   title = parser.title
+   for p in parsers:
+      parser = p(filename, charset)
+      if parser:
+         break
+      else:
+         if log: log("Parser %s.%s failed, trying next one." % (p.__module__, p.__name__))
 
+   title = parser.title
    if not parser.charset:
       try:
          unicode(title, "ascii")
@@ -54,10 +65,20 @@ def parse_html(filename, charset=None, log=None):
          if parser.meta_charset:
             if log: log("   META charset   : %s" % parser.charset)
          else:
-            if log: log("   charset        : %s" % parser.charset)
-         if log: log("   title          : %s" % title)
-         title = unicode(title, parser.charset, "replace").encode(current_charset, "replace")
+            if log: log("   HTTP charset   : %s" % parser.charset)
          if log: log("   current charset: %s" % current_charset)
+         if log: log("   title          : %s" % title)
+         save_title = title
+         try:
+            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")
+            else:
+               title = unicode(title, parser.charset, "replace").encode(current_charset, "replace")
          if log: log("   converted title: %s" % title)
       except LookupError:
          if log: log("   unknown charset: `%s' or `%s'" % (parser.charset, current_charset))