Note: Answers are only revealed after a correct submission. If you've
        have not already solved the puzzle, AocdError will be raised.

def _get_answer(self, part):
        """
        Note: Answers are only revealed after a correct submission. If you've
        have not already solved the puzzle, AocdError will be raised.
        """
        answer_fname = getattr(self, "answer_{}_fname".format(part))
        if os.path.isfile(answer_fname):
            with open(answer_fname) as f:
                return f.read().strip()
        # scrape puzzle page for any previously solved answers
        response = requests.get(self.url, cookies=self._cookies, headers=self._headers)
        response.raise_for_status()
        soup = bs4.BeautifulSoup(response.text, "html.parser")
        if not self._title:
            # may as well save this while we're here
            self._save_title(soup=soup)
        hit = "Your puzzle answer was"
        paras = [p for p in soup.find_all("p") if p.text.startswith(hit)]
        if paras:
            parta_correct_answer = paras[0].code.text
            self._save_correct_answer(value=parta_correct_answer, part="a")
            if len(paras) > 1:
                _p1, p2 = paras
                partb_correct_answer = p2.code.text
                self._save_correct_answer(value=partb_correct_answer, part="b")
        if os.path.isfile(answer_fname):
            with open(answer_fname) as f:
                return f.read().strip()
        msg = "Answer {}-{}{} is not available".format(self.year, self.day, part)
        raise PuzzleUnsolvedError(msg)