]> git.phdru.name Git - bookmarks_db.git/commitdiff
Try BeautifulSoup; if it fails - fall back to HTML Parser.
authorOleg Broytman <phd@phdru.name>
Tue, 18 Dec 2007 05:55:31 +0000 (05:55 +0000)
committerOleg Broytman <phd@phdru.name>
Tue, 18 Dec 2007 05:55:31 +0000 (05:55 +0000)
git-svn-id: file:///home/phd/archive/SVN/bookmarks_db/trunk@113 fdd5c36f-1aea-0310-aeeb-c58d7e2b6c23

Robots/parse_html.py
Robots/parse_html_beautifulsoup.py

index 3250a0de5980c43a00c6cce8ff5e91a9e5b5471c..fc9514d005e5c02dce4fe4717c7e1732060d7cd6 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 failed, trying next one." % p)
 
+   title = parser.title
    if not parser.charset:
       try:
          unicode(title, "ascii")
index 8c51d0500b6e78d19475f1b25e6c29c250b3c8c9..3408def7162a50deec9fee0f4894fdff5e37c9ea 100644 (file)
@@ -20,34 +20,29 @@ class BSoupParser(HTMLParser):
 
 def parse_html(filename, charset=None):
    infile = open(filename, 'r')
-   root = BeautifulSoup(infile, fromEncoding=charset)
+   try:
+      root = BeautifulSoup(infile, fromEncoding=charset)
+   except TypeError:
+      return None
    infile.close()
 
    _charset = root.originalEncoding
    try:
       title = root.html.head.title.string.encode(_charset)
    except AttributeError:
-      title = ''
+      return None
 
-   try:
-      meta = root.html.head.find(_find_refresh, recursive=False)
-   except AttributeError:
-      refresh = None
+   meta = root.html.head.find(_find_refresh, recursive=False)
+   if meta:
+      refresh = meta.get("content")
    else:
-      if meta:
-         refresh = meta.get("content")
-      else:
-         refresh = None
+      refresh = None
 
-   try:
-      meta = root.html.head.find(_find_icon, recursive=False)
-   except AttributeError:
-      icon = None
+   meta = root.html.head.find(_find_icon, recursive=False)
+   if meta:
+      icon = meta.get("href")
    else:
-      if meta:
-         icon = meta.get("href")
-      else:
-         icon = None
+      icon = None
 
    return BSoupParser(_charset, _charset != charset, title, refresh, icon)