Neculai Fantanaru

Everything Depends On The Leader

Python: анализ Docx в Html со стилями обработки

On September 21, 2023
, in
Python Scripts Examples by Neculai Fantanaru

Вы можете просмотреть весь код здесь: https://pastebin.com/T7iF3X3S

Допустим, у меня есть файл bebe.docx, содержащий 10 статей, переведенных на английский язык, с заголовком и текстом статьи.

Код откроет файл bebe.docx, передаст данные через шаблон index.html, а затем сохранит каждый отдельный файл. статья в формате html с именем файла в соответствии с названием статьи. А здесь вы найдете и другие изменения в html-тегах...

import os
import re
import unidecode
from docx import Document
# Funcția pentru adăugarea conținutului la tag-ul meta
def add_content_to_meta(html_content, content_to_add):
   meta_pattern = r'<meta name="description" content="(.*?)">'
   match = re.search(meta_pattern, html_content)
   if match:
       old_meta_tag = match.group(0)
       new_content = re.sub(r'<em>(.*?)</em>', r'\1', content_to_add)  # Elimină tag-urile <em>
       new_meta_tag = f'<meta name="description" content="{new_content}">'
       updated_html_content = html_content.replace(old_meta_tag, new_meta_tag)
       return updated_html_content
   else:
       return html_content
# Funcția pentru conversia stilurilor paragrafelor din DOCX în HTML
def extract_data_from_docx(file_path):
   doc = Document(file_path)
   content = ""
   # Parcurge toate paragrafele din document și le adaugă la conținut
   for paragraph in doc.paragraphs:
       content += paragraph.text + "\n"
   # Utilizăm regex pentru a găsi titlurile și corpul fiecărui articol
   articles = re.split(r'^([A-Z][\w\s\-\(\)]+)$', content, flags=re.MULTILINE | re.DOTALL)
   articles = [article.strip() for article in articles if article.strip()]
   data = []
   # Iterăm prin lista de articole pentru a extrage titlul și corpul corespunzător
   for i in range(0, len(articles), 2):
       title = articles[i]
       body = articles[i + 1].strip().split("\n")
       data.append((title, body))
   return data
def convert_docx_to_html_style(para):
   result = ""
   if para.runs:
       contains_bold = any(run.bold for run in para.runs)
       contains_italic = any(run.italic for run in para.runs)
       contains_regular = any(not run.bold and not run.italic for run in para.runs)
       if contains_bold and contains_italic and contains_regular:
           # Cazul 4: Textul conține atât bold, cât și italic și text regulat
           html_para = '<p class="text_obisnuit">'
           is_bold = False
           is_italic = False
           for run in para.runs:
               if run.bold and not is_bold:
                   html_para += '<span class="text_obisnuit2">'
                   is_bold = True
               if run.italic and not is_italic:
                   html_para += '<em>'
                   is_italic = True
               elif not run.bold and is_bold:
                   html_para += '</span>'
                   is_bold = False
               elif not run.italic and is_italic:
                   html_para += '</em>'
                   is_italic = False
               html_para += run.text
           if is_bold:
               html_para += '</span>'
           if is_italic:
               html_para += '</em>'
           html_para += '</p>\n'
       elif contains_bold and contains_regular:
           # Cazul 3: Textul conține atât bold, cât și text regulat
           html_para = '<p class="text_obisnuit">'
           is_bold = False
           for run in para.runs:
               if run.bold and not is_bold:
                   html_para += '<span class="text_obisnuit2">'
                   is_bold = True
               elif not run.bold and is_bold:
                   html_para += '</span>'
                   is_bold = False
               html_para += run.text
           if is_bold:
               html_para += '</span>'
           html_para += '</p>\n'
       elif contains_bold:
           # Cazul 2: Textul conține doar bold
           html_para = '<p class="text_obisnuit2">'
           for run in para.runs:
               html_para += run.text
           html_para += '</p>\n'
       elif contains_italic:
           # Cazul 5: Textul conține doar italic
           html_para = '<p class="text_obisnuit">'
           is_italic = False
           for run in para.runs:
               if run.italic and not is_italic:
                   html_para += '<em>'
                   is_italic = True
               elif not run.italic and is_italic:
                   html_para += '</em>'
                   is_italic = False
               html_para += run.text
           if is_italic:
               html_para += '</em>'
           html_para += '</p>\n'
       else:
           # Cazul 1: Textul este regulat (fără bold sau italic)
           html_para = '<p class="text_obisnuit">'
           for run in para.runs:
               html_para += run.text
           html_para += '</p>\n'
       result += html_para
   return result
def generate_filename(title):
   # Îndepărtează spațiile și caracterele speciale din titlu
   title = title.strip()
   title = re.sub(r's|t', '', title)
   title = re.sub(r'[^a-zA-Z0-9\s]', '', title)
   # Transformă titlul în litere mici
   title = title.lower()
   title = title.replace(' ', '-')
   # Asigură că numele fișierului are o extensie .html
   filename = title + ".html"
   print("Filename:", filename)  # Afișează numele fișierului
   return filename
def update_and_save_html(title, body, template_path, output_directory):
   with open(template_path, "r", encoding="utf-8") as f:
       html_content = f.read()
   # Eliminarea sufixului "" din titlu
   title_without_suffix = title.replace("", "")
   # Înlocuirea titlului în tagul <h1> cu titlul fără sufix
   html_content = html_content.replace('<h1 class="den_articol" itemprop="name">XXX</h1>', f'<h1 class="den_articol" itemprop="name">{title_without_suffix}</h1>')
   # Înlocuirea titlului în conținutul HTML
   new_title = title + ""
   html_content = html_content.replace("XXX", new_title, 2)
   print("Titlul a fost înlocuit.")
   # Găsirea poziției de început și sfârșit a blocului YYY
   start_marker = "<!-- ARTICOL START -->"
   end_marker = "<!-- ARTICOL FINAL -->"
   start = html_content.find(start_marker)
   end = html_content.find(end_marker)
   if start != -1 and end != -1:
       # Înlocuirea blocului YYY cu conținutul articolului, respectând formatarea cerută
       article_content = ""
       first_sentence = True
       for line in body:
           line = line.strip()
           # Începe prima propoziție cu <p class="text_obisnuit2">
           if first_sentence:
               article_content += f'\n\t<p class="text_obisnuit2"><em>{line}</em></p>'
               first_sentence = False
           elif line.startswith("Leadership:"):
               article_content += f'\n\t<p class="text_obisnuit2">{line}</p>'
           else:
               article_content += f'\n\t<p class="text_obisnuit">{line}</p>'
       html_content = html_content[:start + len(start_marker)] + article_content + html_content[end:]
       print("Corpul articolului a fost înlocuit conform cerințelor.")
   # Integrarea stilurilor de paragrafe din DOCX în HTML
   doc = Document("bebe.docx")
   for para in doc.paragraphs:
       html_style = convert_docx_to_html_style(para)
       html_content = html_content.replace("<p class=\"text_obisnuit\">{}</p>".format(para.text), html_style)
   # Eliminarea caracterelor speciale folosind unidecode
   html_content = unidecode.unidecode(html_content)
   # Crearea numelui de fișier bazat pe titlu
   filename = generate_filename(title)
   # Înlocuirea "zzz.html" cu numele fișierului generat în fiecare fișier HTML
   html_content = html_content.replace("zzz.html", filename)
   # Salvarea modificărilor în UTF-8
   with open(os.path.join(output_directory, filename), "w", encoding="utf-8") as f:
       f.write(html_content)
   print(f"Fișierul a fost salvat ca {filename}")
# Extragem datele din bebe.docx
articles_data = extract_data_from_docx("bebe.docx")
# Specifică directorul în care dorești să salvezi fișierele HTML
output_directory = "output"
# Actualizăm și salvăm fiecare articol într-un fișier HTML separat
for title, body in articles_data:
   update_and_save_html(title, body, "index.html", output_directory)
# Deschide fișierul HTML pentru actualizare
   html_file_path = os.path.join(output_directory, generate_filename(title))
   with open(html_file_path, "r", encoding="utf-8") as html_file:
       html_content = html_file.read()
   # Colectează conținutul paragrafelor cu clasa "text_obisnuit2"
   content_to_add = ""
   paragraphs = re.findall(r'<p class="text_obisnuit2">(.*?)</p>', html_content)
   for paragraph in paragraphs:
       content_to_add += paragraph.strip() + ' '
   # Elimină tag-urile <em> din conținutul adăugat
   content_to_add_cleaned = re.sub(r'<em>(.*?)</em>', r'\1', content_to_add)
   # Adaugă conținutul curățat la tag-ul meta
   updated_html_content = add_content_to_meta(html_content, content_to_add_cleaned)
   # Actualizează fișierul HTML cu conținutul adăugat
   with open(html_file_path, "w", encoding="utf-8") as updated_html_file:
       updated_html_file.write(updated_html_content)
print("Conținutul a fost adăugat la tag-ul meta în fiecare fișier HTML, eliminând tag-urile <em>.")


That's all folks.


Также ознакомьтесь с другими моими скриптами Python ---ЗДЕСЬ---

Alatura-te Comunitatii Neculai Fantanaru
63 величайших качества лидера
Cele 63 de calităţi ale liderului

Зачем читать эту книгу? Потому что это имеет решающее значение для оптимизации вашей производительности. Потому что раскрывает основные координаты, после чего строят характер и навыки лидеров, подчеркивая, что им важно для повышения своего влияния.

Лидерство – магия мастерства
Atingerea maestrului

Существенной характеристикой этой книги по сравнению с другими книгами, представленными на рынке в той же области, является то, что она описывает на примерах идеальные компетенции лидера. Я никогда не утверждал, что стать хорошим лидером легко, но если люди будут...

Мастерское прикосновение
Leadership - Magia măiestriei

Для некоторых лидеров «руководство» больше напоминает шахматную игру, игру ума и проницательности; для других это означает азартную игру, игру, которую, как они думают, они могут выиграть каждый раз, рискуя и ставя все на одну карту.

Загадка лидерства
Leadership Puzzle

Я написал эту книгу, которая простым способом соединяет личностное развитие с лидерством, как пазл, где нужно соединять все данные кусочки, чтобы составить общий образ.

Руководство
Leadership - Pe înţelesul tuturor

Цель этой книги — предоставить вам информацию на конкретных примерах и показать, как обрести способность заставить других смотреть на вещи под той же точкой зрения, что и вы.

Лидерство для чайников
Leadership - Pe înţelesul tuturor

Не считая это согласием, книга представляет собой попытку обычного человека - автора - который простыми словами, фактами и обычными примерами вселяет в обычного человека смелость и оптимизм в его собственном стремлении быть хозяином самому себе и кто знает. ..может даже лидер.