Finds cadidate nodes for the readable version of the article.

    Here's we're going to remove unlikely nodes, find scores on the rest,
    clean up and return the final best match.

def find_candidates(document):
    """
    Finds cadidate nodes for the readable version of the article.

    Here's we're going to remove unlikely nodes, find scores on the rest,
    clean up and return the final best match.
    """
    nodes_to_score = set()
    should_remove = set()

    for node in document.iter():
        if is_unlikely_node(node):
            logger.debug(
                "We should drop unlikely: %s %r", node.tag, node.attrib)
            should_remove.add(node)
        elif is_bad_link(node):
            logger.debug(
                "We should drop bad link: %s %r", node.tag, node.attrib)
            should_remove.add(node)
        elif node.tag in SCORABLE_TAGS:
            nodes_to_score.add(node)

    return score_candidates(nodes_to_score), should_remove