U savremenom web okruženju, često je potrebno preuzeti samo sadržaj članka sa WordPress stranice — tekst, slike, matematičke formule i programski kod — bez dodatnih elemenata kao što su navigacija, reklame ili komentari. Python skripta wordpress2html.py
upravo to omogućava, čineći proces jednostavnim, automatizovanim i prilagodljivim za dalju obradu.
Ključne funkcionalnosti
1. Preuzimanje HTML stranice
Program koristi biblioteku requests
za preuzimanje HTML-a sa zadate URL adrese. Stranica se odmah čuva lokalno kako bi se kasnije mogla dodatno obrađivati.
response = requests.get(url)
with open(output_file, 'w', encoding='utf-8') as f:
f.write(response.text)
2. Preuzimanje i lokalno čuvanje slika
Sve slike iz članka, uključujući „featured“ sliku, automatski se preuzimaju i smeštaju u poseban folder. Program koristi BeautifulSoup
za pronalaženje <img>
tagova i urljoin
za generisanje punih URL-ova slika.
local_filename = os.path.join(folder, os.path.basename(urlparse(img_url).path))
Featured image se posebno traži u elementima kao što su <div class="bs-blog-thumb">
ili <a class="bs-blog-thumb caption">
.
3. Izdvajanje glavnog sadržaja
Skripta pronalazi glavni sadržaj članka kroz predefinisane tagove kao što su <article>
, <div class="entry-content">
ili <main>
. Sve što se nalazi ispod navigacije (post-navigation
) se uklanja kako bi se dobio čist tekst.
4. Podrška za LaTeX formule
Matematičke formule prepoznate su kroz standardne MathJax formate:
- Inline:
$ ... $
ili\(...\)
- Display:
$$ ... $$
ili\[ ... \]
Skripta automatski dodaje MathJax skriptu u <head>
HTML fajla, što omogućava pravilno renderovanje formula u browseru ili pri konverziji u druge formate.
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
5. Prilagođavanje izgleda
Dodaje osnovni CSS za tabele i slike kako bi prikaz bio čist i pregledan, sa automatskim skaliranjem slika i stilizovanim tabelama.
6. Automatsko dodavanje naslova i featured image
Na početak članka se ubacuje naslov stranice (<h1>
), centriran i stilizovan, a odmah nakon njega, ukoliko postoji, prikazuje se featured image.
naslov_tag = soup.new_tag('h1')
naslov_tag.string = soup.title.string if soup.title else 'Naslov stranice'
main.insert(0, naslov_tag)
7. Jednostavna upotreba
Program se pokreće iz terminala:
python3 wordpress2html.py https://primer-stranice.com/nekiclanak
Rezultat je lokalni HTML fajl sa čistim sadržajem članka, slikama i MathJax formulama spreman za dalju obradu ili konverziju u DOCX, PDF i druge formate.
Prednosti programa
- Brzo i jednostavno: Bez potrebe za ručnim kopiranjem teksta i slika.
- Automatizovano preuzimanje formula i koda: MathJax formule i programski blokovi ostaju netaknuti.
- Lokalno čuvanje resursa: Sve slike se preuzimaju u poseban folder i linkuju relativno.
- Fleksibilnost: Jednostavno se može nadograditi za dodatne tipove sadržaja ili stilizovanje.
Zaključak
Skripta wordpress2html.py
predstavlja moćan alat za sve koji žele da sa WordPress stranica izdvoje sadržaj u čistom i upotrebljivom obliku. Idealna je za kreiranje arhiva, pripremu materijala za štampu, obrazovne prezentacije ili automatsku konverziju u druge formate poput DOCX ili PDF.
Instalacija potrebnih zavisnosti:
python3 -m pip install requests beautifulsoup4
Programsk kod za wordpress2html.py
#wordpress2html.py #!/usr/bin/env python3 import sys import os import requests from bs4 import BeautifulSoup from urllib.parse import urlparse, urljoin # ---------------------- Funkcije ---------------------- def download_html(url, output_file): """Preuzmi HTML sa URL-a i sačuvaj lokalno""" try: print(f" Preuzimam: {url}") response = requests.get(url) response.raise_for_status() with open(output_file, 'w', encoding='utf-8') as f: f.write(response.text) print(f" Stranica je sačuvana kao {output_file}") except requests.exceptions.RequestException as e: print(f" Greška prilikom preuzimanja stranice: {e}") sys.exit(1) def download_image(img_url, folder, html_file): """Preuzmi sliku i snimi je u folder""" try: os.makedirs(folder, exist_ok=True) local_filename = os.path.join(folder, os.path.basename(urlparse(img_url).path)) response = requests.get(img_url, stream=True) response.raise_for_status() with open(local_filename, 'wb') as f: for chunk in response.iter_content(1024): f.write(chunk) return os.path.relpath(local_filename, os.path.dirname(html_file)) except Exception as e: print(f" Greška prilikom preuzimanja slike {img_url}: {e}") return img_url def get_featured_image(soup, base_url, html_file): """Pronađi featured/sliku članka""" # Prvo traži <div class="bs-blog-thumb"> div_thumb = soup.find('div', class_='bs-blog-thumb') if div_thumb: img_tag = div_thumb.find('img') if img_tag and img_tag.get('src'): img_url = urljoin(base_url, img_tag['src']) img_tag['src'] = download_image(img_url, f"{os.path.splitext(html_file)[0]}_images", html_file) return img_tag # Ako ne postoji, traži <a class="bs-blog-thumb caption"> a_thumb = soup.find('a', class_='bs-blog-thumb caption') if a_thumb: img_tag = a_thumb.find('img') if img_tag and img_tag.get('src'): img_url = urljoin(base_url, img_tag['src']) img_tag['src'] = download_image(img_url, f"{os.path.splitext(html_file)[0]}_images", html_file) return img_tag return None def clean_html(html_file, base_url): """Očisti HTML direktno u fajl""" with open(html_file, 'r', encoding='utf-8') as f: soup = BeautifulSoup(f, 'html.parser') # Pronađi glavni sadržaj main = soup.find('article') or soup.find('div', class_='entry-content') or soup.find('main') or soup.body # Ukloni Post navigation i sve što je ispod post_nav = main.find(class_='post-navigation') if post_nav: for elem in post_nav.find_all_next(): elem.decompose() post_nav.decompose() # CSS za tabele i slike TABLE_CSS = """ <style> table {border-collapse: collapse; width: 100%; margin: 10px 0;} th, td {border: 1px solid #333; padding: 6px 8px; text-align: left;} th {background-color: #f0f0f0;} img {max-width: 100%; height: auto;} </style> """ # MathJax skripta MATHJAX_SCRIPT = """ <script> window.MathJax = { tex: { inlineMath: [['$', '$'], ['\\\\(', '\\\\)']], displayMath: [['$$','$$'], ['\\\\[','\\\\]']] } }; </script> <script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> """ # Folder za slike img_folder = f"{os.path.splitext(html_file)[0]}_images" os.makedirs(img_folder, exist_ok=True) # Featured image featured_img_tag = get_featured_image(soup, base_url, html_file) # Preuzmi i zameni sve slike u glavnom tekstu for img in main.find_all('img'): src = img.get('src') if not src: continue img_url = urljoin(base_url, src) img['src'] = download_image(img_url, img_folder, html_file) # Dodaj naslov na početak main naslov_tag = soup.new_tag('h1') naslov_tag.string = soup.title.string if soup.title else 'Naslov stranice' naslov_tag['style'] = 'text-align:center;font-size:28px;color:black;' main.insert(0, naslov_tag) # Ubaci featured image odmah posle naslova if featured_img_tag: naslov_tag.insert_after(featured_img_tag) # Snimi očišćen HTML html_str = f"<html><head>{TABLE_CSS}{MATHJAX_SCRIPT}</head><body>{str(main)}</body></html>" with open(html_file, 'w', encoding='utf-8') as f: f.write(html_str) print(f" Očišćen HTML sačuvan u: {html_file}") # ---------------------- Glavni program ---------------------- def main(): if len(sys.argv) < 2: print("Upotreba: python3 wordpress2html.py <URL>") sys.exit(1) url = sys.argv[1] # Izračunaj lokalni naziv fajla na osnovu URL-a parsed = urlparse(url) base_name = parsed.path.strip("/").split("/")[-1] or "wordpress_stranica" raw_html_file = f"{base_name}.html" # Preuzmi HTML sa interneta download_html(url, raw_html_file) # Očisti HTML i sačuvaj u isti fajl clean_html(raw_html_file, url) if __name__ == "__main__": main()