def handle_starttag(self, tag, attrs):
        """
        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')
        """
        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)