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()