add lots of metadata including revision data

This commit is contained in:
trnq1ll0 committed 2024-08-31 12:51:12 +02:00
1 parent 0fb19123d7
commit 760ba92316
2 files changed
+70 -10

No files matched your search

+4
View File
@@ -12,6 +12,10 @@ Das Paket lädt dafür alle Seiten eines MediaWikis herunter und speichert sie i
* es wird html2text verwendet um die Seiten von HTML in Markdown zu konvertieren * es wird html2text verwendet um die Seiten von HTML in Markdown zu konvertieren
* Meta-informationen der Seite werden am Ende in einem json gespeichert * Meta-informationen der Seite werden am Ende in einem json gespeichert
* Dateien werden in einem separaten Ordner gespeichert un im Metadaten json richtig verlinkt * Dateien werden in einem separaten Ordner gespeichert un im Metadaten json richtig verlinkt
* Wikiseiten die zwar erstellt sind aber keinen Inhalt haben werden ignoriert
* entfernt aktuell nur deutschsprachigen links zum Abschnitt bearbeiten: "[Bearbeiten]" und "[Quelltext bearbeiten]
* Tabellen werden aktuell noch nicht richtig importiert
* revisionen werden in Metadata gespeichert mit timestamp und comment (falls vorhanden)
### Metadaten JSON ### Metadaten JSON
+66 -10
View File
@@ -1,5 +1,6 @@
import os import os
import json import json
import re
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import html2text import html2text
@@ -66,16 +67,16 @@ def save_content_to_file(content, download_folder, page_name, extension='md'):
os.makedirs(os.path.dirname(file_path), exist_ok=True) os.makedirs(os.path.dirname(file_path), exist_ok=True)
with open(file_path, 'w', encoding='utf-8') as file: with open(file_path, 'w', encoding='utf-8') as file:
file.write(content) file.write(content)
print(f"Downloaded {page_name} to {file_path}")
def GenerateMetadataJson(data): def GenerateMetadataJson(session, data):
metadata = { metadata = {
'metadata' : { 'metadata' : {
'categories' : data['parse']['categories'], 'categories' : data['parse']['categories'],
'internallinks' : data['parse']['links'], 'internallinks' : data['parse']['links'],
'externallinks' : data['parse']['externallinks'], 'externallinks' : data['parse']['externallinks'],
'images' : data['parse']['images'], 'images' : data['parse']['images'],
'showtoc' : data['parse']['showtoc'] 'showtoc' : data['parse']['showtoc'],
'revisions' : ProcessRevisions(session, api_url, data['parse']['pageid'])
} }
} }
return "\n\n " + json.dumps(metadata, indent=4) return "\n\n " + json.dumps(metadata, indent=4)
@@ -116,6 +117,49 @@ def StoreImages(session, images_list, json_string):
def ReplaceImagePath(str, image_name, image_path): def ReplaceImagePath(str, image_name, image_path):
return str.replace(f'"{image_name}"', f'"./{image_path}"') return str.replace(f'"{image_name}"', f'"./{image_path}"')
def HandleExternalLinks(externallinks, markdown_content):
# for link in externallinks:
# markdown_content = markdown_content.replace(f"<{link}>", f'[{link}]({link})')
return markdown_content
def HandleInternalLinks(markdown_content):
markdown_content = markdown_content.replace('/index.php?title=', '')
return markdown_content
def RemoveEditLinks(markdown_content):
pattern = r'\[\[Bearbeiten\]\(.*?\)\s\|\s\[Quelltext bearbeiten\]\(.*?\)\]'
matches = re.findall(pattern, markdown_content)
# double check if the match is correct, than remove it
for match in matches:
if "[Bearbeiten]" in match and "[Quelltext bearbeiten]" in match:
markdown_content = markdown_content.replace(match, '')
return markdown_content
def ProcessRevisions(session, api_url, page_id):
params = {
'action': 'query',
'format': 'json',
'prop': 'revisions',
'rvlimit': 500,
'pageids': page_id
}
response = session.get(api_url, params=params)
if response.status_code == 200:
data = response.json()
first_child_key = next(iter(data['query']['pages']))
revisions = data['query']['pages'][first_child_key]['revisions']
revisons_block = []
# print(f"Found {len(revisions)} revision: {json.dumps(revisions[0])}")
for revision in revisions:
revisons_block.append({
'timestamp' : revision['timestamp'],
'comment' : revision['comment']
})
return revisons_block
else:
print(f"Failed to download revisions for page_id {page_id}")
def main(): def main():
global api_url global api_url
global images_folder global images_folder
@@ -135,7 +179,12 @@ def main():
with requests.Session() as session: with requests.Session() as session:
login(session, api_url, username, password) login(session, api_url, username, password)
all_pages = download_all_pages(session, api_url) all_pages = download_all_pages(session, api_url)
print(f"Downloading {len(all_pages)} pages")
############
#all_pages[0]['title'] = "Haushalt"
#all_pages[0]['title'] = "Über ONEH mediawiki"
page_count = 0
for page in all_pages: for page in all_pages:
if maxfiles == 0: if maxfiles == 0:
break break
@@ -150,16 +199,23 @@ def main():
response = session.get(api_url, params=params) response = session.get(api_url, params=params)
if response.status_code == 200: if response.status_code == 200:
data = response.json() data = response.json()
# wiki can have created pages without content, we ignore them here
if 'parse' in data: if 'parse' in data:
markdown_content = html2text.html2text(data['parse']['text']) page_count += 1
markdown_content += GenerateMetadataJson(data) converter = html2text.HTML2Text()
converter.IMAGES_AS_HTML = True
markdown_content = converter.handle(data['parse']['text'])
markdown_content = RemoveEditLinks(markdown_content)
markdown_content = HandleExternalLinks(data['parse']['externallinks'], markdown_content)
markdown_content = HandleInternalLinks(markdown_content)
markdown_content += GenerateMetadataJson(session, data)
markdown_content = StoreImages(session, data['parse']['images'], markdown_content) markdown_content = StoreImages(session, data['parse']['images'], markdown_content)
if markdown_content: if markdown_content:
save_content_to_file(markdown_content, pages_folder, page_title, extension='md') save_content_to_file(markdown_content, pages_folder, page_title, extension='txt')
print(f"Downloaded page {page_count}: {page_title}")
else: else:
print(f"Failed to parse page {page_title}") print(f"Failed to download page {page_title}")
else:
print(f"Failed to download page {page_title}")
if __name__ == "__main__": if __name__ == "__main__":
main() main()