Source code for tibiapy.parsers.fansite

"""Module containing the parser for supported and promoted fansites."""
import bs4

from tibiapy import InvalidContentError
from tibiapy.models.fansite import (
    Fansite,
    FansiteContent,
    FansiteSocialMedia,
    FansitesSection,
)
from tibiapy.utils import get_rows, parse_popup, parse_tibiacom_content


[docs] class FansitesSectionParser: """Parser for the fansites section."""
[docs] @classmethod def from_content(cls, content: str) -> FansitesSection: """Get the list of available fansites from the HTML of the Tibia.com fansites section. Parameters ---------- content: The HTML content of the page. Returns ------- The fansites section. Raises ------ InvalidContent If content is not the HTML of the fansites section's page. """ try: parsed_content = parse_tibiacom_content(content, builder="html5lib") promoted_table = parsed_content.select_one("#promotedfansitesinnertable") supported_table = parsed_content.select_one("#supportedfansitesinnertable") return FansitesSection( promoted_fansites=cls._parse_fansites_table(promoted_table), supported_fansites=cls._parse_fansites_table(supported_table), ) except (ValueError, IndexError) as e: raise InvalidContentError("content does not belong to the bazaar at Tibia.com", original=e) from e
@classmethod def _parse_fansites_table(cls, table: bs4.Tag) -> list[Fansite]: fansites = [] for row in get_rows(table)[1:]: cols = row.select("td") site_image = cols[0].select_one("img") site_link = cols[0].select_one("a") name = site_image["alt"] image_url = site_image["src"] site_url = site_link["href"] character = cols[1].select_one("a").text content = [] content_poupups = cols[2].select("span") for content_span in content_poupups: _, popup = parse_popup(content_span["onmouseover"]) content.append(FansiteContent(name=popup.text, icon_url=content_span.select_one("img")["src"])) social = [] social_poupups = cols[3].select("span") for social_span in social_poupups: _, popup = parse_popup(social_span["onmouseover"]) social.append(FansiteSocialMedia(name=popup.text, icon_url=social_span.select_one("img")["src"])) languages = [] languages_poupups = cols[4].select("div.HelperDivIndicator") for language_div in languages_poupups: _, popup = parse_popup(language_div["onmouseover"]) languages.append(popup.text) specials = [t.text for t in cols[5].select("li")] fansite_item_img = cols[6].select_one("img") item_url = fansite_item_img["src"] if fansite_item_img else None fansites.append( Fansite( name=name, url=site_url, logo_url=image_url, contact=character, content=content, social_media=social, languages=languages, specials=specials, fansite_item_image_url=item_url, ), ) return fansites