]> git.phdru.name Git - bookmarks_db.git/blob - parse_html/htmlparser.py
0932873f14a9566b74d056feed7b261f1a9ce9a0
[bookmarks_db.git] / parse_html / htmlparser.py
1 """HTML Parser using Pythons' HTMLParser
2
3 This file is a part of Bookmarks database and Internet robot.
4 """
5
6 __version__ = "$Revision$"[11:-2]
7 __revision__ = "$Id$"[5:-2]
8 __date__ = "$Date$"[7:-2]
9 __author__ = "Oleg Broytman <phd@phdru.name>"
10 __copyright__ = "Copyright (C) 1997-2011 PhiloSoft Design"
11 __license__ = "GNU GPL"
12
13 from HTMLParser import HTMLParseError
14 from m_lib.net.www.html import HTMLParser as _HTMLParser
15
16
17 class HTMLHeadDone(Exception): pass
18
19
20 class HTMLParser(_HTMLParser):
21    def __init__(self, charset=None):
22       _HTMLParser.__init__(self)
23       self.charset = charset
24       self.meta_charset = 0
25       self.title = None
26       self.refresh = None
27       self.icon = None
28
29    def end_head(self):
30       raise HTMLHeadDone()
31
32
33    def do_meta(self, attrs):
34       http_equiv = ""
35       content = ""
36
37       for attrname, value in attrs:
38          if value:
39             value = value.strip()
40             if attrname == 'http-equiv':
41                http_equiv = value.lower()
42             elif attrname == 'content':
43                content = value
44
45       if (not self.charset) and (http_equiv == "content-type"):
46          try:
47             # extract charset from "text/html; foo; charset=UTF-8, bar; baz;"
48             self.charset = content.lower().split('charset=')[1].split(';')[0].split(',')[0]
49             self.meta_charset = 1 # Remember that the charset was retrieved from
50                                   # META tag, not from the Content-Type header
51          except IndexError:
52             pass
53
54       if http_equiv == "refresh":
55          self.refresh = content
56
57
58    def start_title(self, attrs):
59       self.accumulator = ''
60
61    def end_title(self):
62       if not self.title: # use only the first title
63          self.title = self.accumulator
64
65
66    def do_link(self, attrs):
67       has_icon = False
68       href = None
69
70       for attrname, value in attrs:
71          if value:
72             value = value.strip()
73             if (attrname == 'rel') and (value.lower() in ('icon', 'shortcut icon')):
74                has_icon = True
75             elif attrname == 'href':
76                href = value
77
78       if has_icon:
79          self.icon = href
80
81
82 def parse_html(filename, charset=None, log=None):
83    infile = open(filename, 'r')
84    parser = HTMLParser(charset)
85
86    for line in infile:
87       try:
88          parser.feed(line)
89       except (HTMLParseError, HTMLHeadDone):
90          break
91
92    infile.close()
93
94    try:
95       parser.close()
96    except (HTMLParseError, HTMLHeadDone):
97       pass
98
99    if parser.title is None:
100       return None
101
102    return parser