Kamna TKS 15 na pelety a dřevo

- 10% Pelety a dřevo
Výrobce: TEBA
Záruční doba: 24 měsíců
EAN: Teba
Dostupnost: skladem u dodavatele
46 675 bez DPH
56 476.75 ks
Původní cena 62 751.94 Sleva 10 %
Sledovat produkt Přidat do oblíbených Sdílet

        

 

Kamna na pelety a dřevo s vařením a pečením.

  • Typ paliva: Pelety a dřevo – možnost jednoduchého přepnutí mezi oběma režimy

  • Funkce: Možnost vaření a pečení díky zabudované troubě („vařením a pečením“)

  • Velké ohniště s trojitým prosklením pro lepší výhled na oheň

  • Ovládání: Plně automatické s možností vzdáleného ovládání přes mobilní aplikaci, včetně chrono programu a automatického startu

  • Materiál a elektronika:

    • Konstrukce z kotlové oceli s vedením vzduchu přes nerezové trubky.

    • Elektronika vyvinutá italskou firmou TIEMME. Přehledné menu.

  • Výkon a účinnost:

    • Jmenovitý výkon cca 10 kW.

    • Účinnost kolem 78 %

  • Rozměry a hmotnost:

    • Hmotnost cca 147 kg.

 

 

Rozměry hloubka: 600 MM | šířka: 500 MM | výška: 1170 MM
Palivo Pelety a dřevo
Výkon (Kw) 10 Kw
Průměr kouřovodu 80 mm

 

Doporučujeme zakoupit společně se zbožím

import json import re from urllib.parse import urljoin import requests from bs4 import BeautifulSoup URL = "https://ecokamna.cz/kamna-tks-15-na-pelety-a-drevo/p-308" HEADERS = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/120.0 Safari/537.36" } def clean_text(t): if t is None: return None return re.sub(r"\s+", " ", t).strip() def parse_price(text): if not text: return None m = re.search(r"([\d\s]+(?:[.,]\d{1,2})?)\s*Kč", text) if not m: return None amt = m.group(1).replace(" ", "").replace(",", ".") try: return float(amt) except ValueError: return None def extract_images(soup, base_url): imgs = [] for img in soup.select("img"): src = img.get("src") or img.get("data-src") if not src: continue url = urljoin(base_url, src) if any(x in url.lower() for x in ["logo", "icon", "newsletter"]): continue if url not in imgs: imgs.append(url) return imgs def extract_kv_block(soup): kv = {} info_texts = [] for el in soup.select("*"): txt = clean_text(el.get_text(" ", strip=True)) if txt: info_texts.append(txt) blob = " | ".join(info_texts) patterns = { "vyrobce": r"(?i)\b(Výrobce)\s*[: ]\s*(.+?)\s*(?:\||$)", "zaruka": r"(?i)\b(Záruční doba)\s*[: ]\s*(.+?)\s*(?:\||$)", "ean": r"(?i)\bEAN\s*[: ]\s*(\d+)", "energeticka_trida": r"(?i)\bEnergetick[áa]\s*t[řr]ída\s*[: ]\s*(A\+{0,2}|[A-G][\+\-]?)", "dostupnost": r"(?i)\bDostupnost\s*[: ]\s*([^\|]+?)\s*(?:\||$)", } for key, pat in patterns.items(): m = re.search(pat, blob) if m: kv[key] = clean_text(m.group(1 if key!="energeticka_trida" else 1)) return kv def extract_spec_table(soup): specs = {} headings = soup.find_all(string=re.compile(r"(?i)Technick")) container = soup for h in headings: container = h.parent break def add_spec(k, v): k = clean_text(k) v = clean_text(v) if k and v and k not in specs: specs[k] = v for el in container.find_all(["p", "li", "div", "span"]): txt = clean_text(el.get_text(" ", strip=True)) if not txt: continue if ":" in txt: k, v = txt.split(":", 1) add_spec(k, v) else: m = re.match(r"(.+?)\s{2,}(.+)", txt) if m: add_spec(m.group(1), m.group(2)) return specs def extract_description(soup): desc_block = None for h in soup.find_all(re.compile("^h[1-6]$")): if re.search(r"(?i)Popis", h.get_text()): desc_block = h.find_next() break if not desc_block: paragraphs = soup.select("p") if not paragraphs: return None long_p = max(paragraphs, key=lambda p: len(p.get_text()), default=None) return clean_text(long_p.get_text()) if long_p else None texts = [] node = desc_block for _ in range(6): if not node: break txt = clean_text(getattr(node, "get_text", lambda *a, **k: "")()) if txt and len(txt) > 20: texts.append(txt) node = node.find_next_sibling() return "\n\n".join(texts) if texts else None def scrape(url=URL): r = requests.get(url, headers=HEADERS, timeout=30) r.raise_for_status() soup = BeautifulSoup(r.text, "lxml") title_el = soup.find(["h1", "h2"], string=True) title = clean_text(title_el.get_text()) if title_el else None text_blob = clean_text(soup.get_text(" ", strip=True)) price_with_vat = parse_price(text_blob) m_no_vat = re.search(r"([\d\s]+(?:[.,]\d{1,2})?)\s*Kč\s*bez\s*DPH", text_blob, re.I) price_no_vat = float(m_no_vat.group(1).replace(" ", "").replace(",", ".")) if m_no_vat else None m_orig = re.search(r"Původní cena\s*([\d\s]+(?:[.,]\d{1,2})?)\s*Kč", text_blob, re.I) original_price = float(m_orig.group(1).replace(" ", "").replace(",", ".")) if m_orig else None m_disc = re.search(r"Sleva\s*([0-9]{1,2})\s*%", text_blob, re.I) discount_pct = int(m_disc.group(1)) if m_disc else None availability = None m_av = re.search(r"(?i)Dostupnost\s*[: ]\s*([^\|]+?)\s*(?:\||$)", text_blob) if m_av: availability = clean_text(m_av.group(1)) kv = extract_kv_block(soup) specs = extract_spec_table(soup) description = extract_description(soup) images = extract_images(soup, url) data = { "url": url, "title": title, "manufacturer": kv.get("vyrobce"), "ean": kv.get("ean"), "energy_class": kv.get("energeticka_trida"), "availability": availability or kv.get("dostupnost"), "price_with_vat_czk": price_with_vat, "price_no_vat_czk": price_no_vat, "original_price_czk": original_price, "discount_percent": discount_pct, "warranty": kv.get("zaruka"), "description": description, "images": images, "specs": specs, } with open("ecokamna_tks15.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) print(json.dumps(data, ensure_ascii=False, indent=2)) print("\nUloženo do ecokamna_tks15.json") if __name__ == "__main__": scrape()