def from_content(cls, content): """Parse a Tibia.com response into a House object. Parameters ---------- content: :class:`str` HTML content of the page. Returns ------- :class:`House` The house contained in the page, or None if the house doesn't exist. Raises ------ InvalidContent If the content is not the house section on Tibia.com """ parsed_content = parse_tibiacom_content(content) image_column, desc_column, *_ = parsed_content.find_all('td') if "Error" in image_column.text: return None image = image_column.find('img') for br in desc_column.find_all("br"): br.replace_with("\n") description = desc_column.text.replace("\u00a0", " ").replace("\n\n", "\n") lines = description.splitlines() try: name, beds, info, state, *_ = lines except ValueError: raise InvalidContent( "content does is not from the house section of Tibia.com") house = cls(name.strip()) house.image_url = image["src"] house.id = int(id_regex.search(house.image_url).group(1)) m = bed_regex.search(beds) if m: if m.group("type").lower() in ["guildhall", "clanhall"]: house.type = HouseType.GUILDHALL else: house.type = HouseType.HOUSE house.beds = int(m.group("beds")) m = info_regex.search(info) if m: house.world = m.group("world") house.rent = parse_tibia_money(m.group("rent")) house.size = int(m.group("size")) house._parse_status(state) return house
def test_parse_tibia_money(self): self.assertEqual(1000, parse_tibia_money("1k")) self.assertEqual(5000000, parse_tibia_money("5kk")) self.assertEqual(2500, parse_tibia_money("2.5k")) self.assertEqual(50, parse_tibia_money("50")) with self.assertRaises(ValueError): parse_tibia_money("abc")
def from_content(cls, content): """Parse the content of a house list from Tibia.com into a list of houses. Parameters ---------- content: :class:`str` The raw HTML response from the house list. Returns ------- :class:`HouseSection` The houses found in the page. Raises ------ InvalidContent` Content is not the house list from Tibia.com """ try: parsed_content = parse_tibiacom_content(content) tables = parse_tibiacom_tables(parsed_content) house_results = cls() house_results._parse_filters(tables["House Search"]) if len(tables) < 2: return house_results houses_table = tables[list(tables.keys())[0]] _, *rows = houses_table.find_all("tr") for row in rows[1:]: cols = row.find_all("td") if len(cols) != 5: continue name = cols[0].text.replace('\u00a0', ' ') house = HouseEntry(name, house_results.world, 0, town=house_results.town, type=house_results.house_type) size = cols[1].text.replace('sqm', '') house.size = int(size) rent = cols[2].text.replace('gold', '') house.rent = parse_tibia_money(rent) status = cols[3].text.replace('\xa0', ' ') house._parse_status(status) id_input = cols[4].find("input", {'name': 'houseid'}) house.id = int(id_input["value"]) house_results.entries.append(house) return house_results except (ValueError, AttributeError, KeyError) as e: raise InvalidContent( "content does not belong to a Tibia.com house list", e)
def list_from_content(cls, content): """Parses the content of a house list from Tibia.com into a list of houses Parameters ---------- content: :class:`str` The raw HTML response from the house list. Returns ------- :class:`list` of :class:`ListedHouse` Raises ------ InvalidContent` Content is not the house list from Tibia.com """ try: parsed_content = parse_tibiacom_content(content) table = parsed_content.find("table") header, *rows = table.find_all("tr") except (ValueError, AttributeError): raise InvalidContent("content does not belong to a Tibia.com house list") m = list_header_regex.match(header.text.strip()) if not m: return None town = m.group("town") world = m.group("world") house_type = HouseType.GUILDHALL if m.group("type") == "Guildhalls" else HouseType.HOUSE houses = [] for row in rows[1:]: cols = row.find_all("td") if len(cols) != 6: continue name = cols[0].text.replace('\u00a0', ' ') house = ListedHouse(name, world, 0, town=town, type=house_type) size = cols[1].text.replace('sqm', '') house.size = int(size) rent = cols[2].text.replace('gold', '') house.rent = parse_tibia_money(rent) status = cols[3].text.replace('\xa0', ' ') house._parse_status(status) id_input = cols[5].find("input", {'name': 'houseid'}) house.id = int(id_input["value"]) houses.append(house) return houses