]> git.phdru.name Git - bookmarks_db.git/blobdiff - parse_html/bkmk_ph_htmlparser.py
Renamed parse_html modules to bkmk_ph_* to avoid name clashes.
[bookmarks_db.git] / parse_html / bkmk_ph_htmlparser.py
diff --git a/parse_html/bkmk_ph_htmlparser.py b/parse_html/bkmk_ph_htmlparser.py
new file mode 100644 (file)
index 0000000..295df2b
--- /dev/null
@@ -0,0 +1,102 @@
+"""HTML Parser using Pythons' HTMLParser
+
+This file is a part of Bookmarks database and Internet robot.
+"""
+
+__version__ = "$Revision$"[11:-2]
+__revision__ = "$Id$"[5:-2]
+__date__ = "$Date$"[7:-2]
+__author__ = "Oleg Broytman <phd@phdru.name>"
+__copyright__ = "Copyright (C) 1997-2011 PhiloSoft Design"
+__license__ = "GNU GPL"
+
+__all__ = ['parse_html']
+
+
+from HTMLParser import HTMLParseError
+from m_lib.net.www.html import HTMLParser as _HTMLParser
+
+
+class HTMLHeadDone(Exception): pass
+
+
+class HTMLParser(_HTMLParser):
+   def __init__(self, charset=None):
+      _HTMLParser.__init__(self)
+      self.charset = charset
+      self.meta_charset = 0
+      self.title = None
+      self.refresh = None
+      self.icon = None
+
+   def end_head(self):
+      raise HTMLHeadDone()
+
+   def do_meta(self, attrs):
+      http_equiv = ""
+      content = ""
+
+      for attrname, value in attrs:
+         if value:
+            value = value.strip()
+            if attrname == 'http-equiv':
+               http_equiv = value.lower()
+            elif attrname == 'content':
+               content = value
+
+      if (not self.charset) and (http_equiv == "content-type"):
+         try:
+            # extract charset from "text/html; foo; charset=UTF-8, bar; baz;"
+            self.charset = content.lower().split('charset=')[1].split(';')[0].split(',')[0]
+            self.meta_charset = 1 # Remember that the charset was retrieved from
+                                  # META tag, not from the Content-Type header
+         except IndexError:
+            pass
+
+      if http_equiv == "refresh":
+         self.refresh = content
+
+   def start_title(self, attrs):
+      self.accumulator = ''
+
+   def end_title(self):
+      if not self.title: # use only the first title
+         self.title = self.accumulator
+
+   def do_link(self, attrs):
+      has_icon = False
+      href = None
+
+      for attrname, value in attrs:
+         if value:
+            value = value.strip()
+            if (attrname == 'rel') and (value.lower() in ('icon', 'shortcut icon')):
+               has_icon = True
+            elif attrname == 'href':
+               href = value
+
+      if has_icon:
+         self.icon = href
+
+
+def parse_html(filename, charset=None, log=None):
+   infile = open(filename, 'r')
+   parser = HTMLParser(charset)
+
+   for line in infile:
+      try:
+         parser.feed(line)
+      except (HTMLParseError, HTMLHeadDone):
+         break
+
+   infile.close()
+
+   try:
+      parser.close()
+   except (HTMLParseError, HTMLHeadDone):
+      pass
+
+   if parser.title is None:
+      return None
+
+   return parser