code: def has_neigh(tag_name, params=None, content=None, left=True):
      
      def has_neigh_closure(element):
          if not element.parent \
             or not (element.isTag() and not element.isEndTag()):
              return False
  
          # filter only visible tags/neighbours
          childs = element.parent.childs
          childs = filter(
              lambda x: (x.isTag() and not x.isEndTag()) \
                        or x.getContent().strip() or x is element,
              childs
          )
          if len(childs) <= 1:
              return False
  
          ioe = childs.index(element)
          if left and ioe > 0:
              return is_equal_tag(childs[ioe - 1], tag_name, params, content)
  
          if not left and ioe + 1 < len(childs):
              return is_equal_tag(childs[ioe + 1], tag_name, params, content)
  
          return False
  
      return has_neigh_closure
docs: This function generates functions, which matches all tags with neighbours
      defined by parameters.
  
      Args:
          tag_name (str): Tag has to have neighbour with this tagname.
          params (dict): Tag has to have neighbour with this parameters.
          params (str): Tag has to have neighbour with this content.
          left (bool, default True): Tag has to have neigbour on the left, or
                                     right (set to ``False``).
  
      Returns:
          bool: True for every matching tag.
  
      Note:
          This function can be used as parameter for ``.find()`` method in
          HTMLElement.