code: def handle_starttag(self, tag, attrs):
          
          dattrs = dict(attrs)
          # look for '<link type='text/css' rel='stylesheet' href='...' > tags
          # to see if looking for link tags makes sense here, we need to know
          # a little more about the implementation. Whether HTML parser looks for 
          # the trailing slash at the end of an element, or just knows which elements
          # should be paired or not. 
          
          if tag.lower() == 'link':
              print "Found link"
              if all (k in dattrs for k in ('rel', 'href', 'type')):
                  if ( dattrs['rel'].lower() == 'stylesheet' and 
                       dattrs['type'].lower() == 'text/css' ):
                      # Add the url to the stack
                      if (dattrs['href'][:5].lower() == 'http:' or 
                         dattrs['href'][:6].lower() == 'https:'):
                          self.linked_sheets.append(dattrs['href'])
                      else:
                          self.linked_sheets.append(self.url_root+dattrs['href'])
                      
          # Look for <style type='text/css' ... /> tags and add their rules
          # into the list.
          elif (tag.lower() == 'style' and 
                'type' in dattrs and dattrs['type'].lower() == 'text/css'):
              #print "Found CSS inline defs"
              self.get_data = True
          self.append_styles(tag, attrs)
docs: This method handles any HTML tags that have a matching
          closing tag. So elements like <p> and <div> are handled 
          by this method.
          @param <string> tag
             An html tag that has a separate closing tag such as <p>
             <div> or <body>
          @param <tuple> attrs
             A tuple of HTML element attributes such as 'class', 'id',
             'style', etc. The tuple is of the form ('html_attribute',
             'attr1', 'attr2', 'attr3' ... 'attrN')