def METHOD_NAME(self, source_dir: Path, soup: BeautifulSoup) -> dict:
    """Reads a single recipe's HTML and converts it to a dictionary"""
    recipe_dict: dict = {}
    recipe_tags: list[str] = []
    for tag in soup.find_all():
        # the recipe image tag has no id, so we parse it directly
        if tag.name == "img" and "recipeImage" in tag.get("class", []):
            if image_path := tag.get("src"):
                recipe_dict["image"] = str(source_dir.joinpath(image_path))
            continue
        # tags (internally named categories) are not in a list, and don't have ids
        if tag.name == "span" and "recipeCategory" in tag.get("class", []):
            recipe_tag = tag.get_text(strip=True)
            if "Tags:" not in recipe_tag:
                recipe_tags.append(recipe_tag)
            continue
        # add only elements with an id to the recipe dictionary
        if not (tag_id := tag.get("id")):
            continue
        # for lists, store the list items as an array (e.g. for recipe instructions)
        if tag.name in ["ul", "ol"]:
            recipe_dict[tag_id] = [item.get_text(strip=True) for item in tag.find_all("li", recursive=False)]
            continue
        # for all other tags, write the text directly to the recipe data
        recipe_dict[tag_id] = tag.get_text(strip=True)
    if recipe_tags:
        recipe_dict["tags"] = recipe_tags
    return recipe_dict