]> git.phdru.name Git - bookmarks_db.git/blob - parse_html/bkmk_ph_htmlparser.py
8cdd240a06c7fb3514e79eb9df571dcf1b67279c
[bookmarks_db.git] / parse_html / bkmk_ph_htmlparser.py
1 """HTML Parser using Pythons' HTMLParser
2
3 This file is a part of Bookmarks database and Internet robot.
4 """
5
6 __author__ = "Oleg Broytman <phd@phdru.name>"
7 __copyright__ = "Copyright (C) 1997-2012 PhiloSoft Design"
8 __license__ = "GNU GPL"
9
10 __all__ = ['parse_html']
11
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    def do_meta(self, attrs):
33       http_equiv = ""
34       content = ""
35
36       for attrname, value in attrs:
37          if value:
38             value = value.strip()
39             if attrname == 'http-equiv':
40                http_equiv = value.lower()
41             elif attrname == 'content':
42                content = value
43
44       if (not self.charset) and (http_equiv == "content-type"):
45          try:
46             # extract charset from "text/html; foo; charset=UTF-8, bar; baz;"
47             self.charset = content.lower().split('charset=')[1].split(';')[0].split(',')[0]
48             self.meta_charset = 1 # Remember that the charset was retrieved from
49                                   # META tag, not from the Content-Type header
50          except IndexError:
51             pass
52
53       if http_equiv == "refresh":
54          self.refresh = content
55
56    def start_title(self, attrs):
57       self.accumulator = ''
58
59    def end_title(self):
60       if not self.title: # use only the first title
61          self.title = self.accumulator
62
63    def do_link(self, attrs):
64       has_icon = False
65       href = None
66
67       for attrname, value in attrs:
68          if value:
69             value = value.strip()
70             if (attrname == 'rel') and (value.lower() in ('icon', 'shortcut icon')):
71                has_icon = True
72             elif attrname == 'href':
73                href = value
74
75       if has_icon:
76          self.icon = href
77
78
79 def parse_html(filename, charset=None, log=None):
80    infile = open(filename, 'r')
81    parser = HTMLParser(charset)
82
83    for line in infile:
84       try:
85          parser.feed(line)
86       except (HTMLParseError, HTMLHeadDone):
87          break
88
89    infile.close()
90
91    try:
92       parser.close()
93    except (HTMLParseError, HTMLHeadDone):
94       pass
95
96    if (parser.title is None) and (parser.refresh is None) and (parser.icon is None):
97       return None
98    return parser