Automatizovano izdvajanje sadržaja iz WordPress stranica: tekst, slike, LaTeX i programski kod

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

By Abel

Leave a Reply

Your email address will not be published. Required fields are marked *