Hoe tekst uit OneNote-bestanden te extraheren in Python
Microsoft OneNote .one bestanden zijn binaire documenten die niet als platte tekst gelezen kunnen worden of geparseerd kunnen worden met generieke XML‑tools. Aspose.Note FOSS for Python biedt een pure‑Python parser die .one bestanden laadt in een volledig documentobjectmodel (DOM), waardoor het eenvoudig is om tekst, opmaakmetadata en hyperlinks programmatisch te extraheren.
Voordelen van het gebruik van Aspose.Note FOSS voor Python
- No Microsoft Office required: lees
.onebestanden op elk platform, inclusief Linux CI/CD-servers - Full text and formatting access: platte tekst, vet/cursief/onderstreept fragmenten, lettertype‑eigenschappen en hyperlink‑URL’s
- Free and open-source: MIT‑licentie, geen gebruikskosten of API‑sleutels
Stapsgewijze handleiding
Stap 1: Installeer Aspose.Note FOSS for Python
Installeer de bibliotheek vanaf PyPI. Het kernpakket heeft geen verplichte afhankelijkheden:
pip install aspose-noteControleer de installatie:
from aspose.note import Document
print("Installation OK")Stap 2: Laad het .one‑bestand
Maak een Document-instantie door het bestandspad door te geven:
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Section: {doc.DisplayName}")
print(f"Pages: {len(list(doc))}")Om te laden vanuit een binaire stream (bijv. vanuit cloudopslag of een HTTP‑respons):
from aspose.note import Document
with open("MyNotes.one", "rb") as f:
doc = Document(f)Stap 3: Alle platte tekst extraheren
Gebruik GetChildNodes(RichText) om elk RichText‑knooppunt in de documentboom te verzamelen. Dit voert een recursieve diepte‑eerste zoekopdracht uit over alle pagina’s, outlines en outline‑elementen:
from aspose.note import Document, RichText
doc = Document("MyNotes.one")
texts = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]
for text in texts:
print(text)Om alle tekst op te slaan in een bestand:
from aspose.note import Document, RichText
doc = Document("MyNotes.one")
texts = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]
with open("extracted_text.txt", "w", encoding="utf-8") as out:
out.write("\n".join(texts))
print(f"Wrote {len(texts)} text blocks to extracted_text.txt")Stap 4: Inspecteer geformatteerde runs
Elke RichText knoop bevat een TextRuns lijst van TextRun segmenten. Elke run draagt een onafhankelijke TextStyle met per‑teken opmaak:
from aspose.note import Document, RichText
doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
for run in rt.TextRuns:
style = run.Style
attrs = []
if style.IsBold: attrs.append("bold")
if style.IsItalic: attrs.append("italic")
if style.IsUnderline: attrs.append("underline")
if style.IsStrikethrough: attrs.append("strikethrough")
if style.FontName: attrs.append(f"font={style.FontName}")
if style.FontSize: attrs.append(f"size={style.FontSize}pt")
label = ", ".join(attrs) if attrs else "plain"
print(f"[{label}] {run.Text!r}")Stap 5: Hyperlinks extraheren
Hyperlinks worden opgeslagen op individuele TextRun knooppunten. Controleer Style.IsHyperlink en lees Style.HyperlinkAddress:
from aspose.note import Document, RichText
doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
for run in rt.TextRuns:
if run.Style.IsHyperlink and run.Style.HyperlinkAddress:
print(f"Link text: {run.Text!r}")
print(f"URL: {run.Style.HyperlinkAddress}")Stap 6: Tekst per pagina extraheren
Om tekst te extraheren, georganiseerd per paginatitel:
from aspose.note import Document, Page, RichText
doc = Document("MyNotes.one")
for page in doc.GetChildNodes(Page):
title = (
page.Title.TitleText.Text
if page.Title and page.Title.TitleText
else "(untitled)"
)
print(f"\n=== {title} ===")
for rt in page.GetChildNodes(RichText):
if rt.Text:
print(rt.Text)Veelvoorkomende problemen en oplossingen
1. ImportError: Geen module met de naam ‘aspose’
Oorzaak: Het pakket is niet geïnstalleerd in de actieve Python-omgeving.
Oplossing:
pip install aspose-note
##Confirm active environment:
pip show aspose-note2. FileNotFoundError bij het laden van .one‑bestand
Oorzaak: Het bestandspad is onjuist of het bestand bestaat niet.
Oplossing: Gebruik een absoluut pad of controleer of het bestand bestaat voordat het wordt geladen:
from pathlib import Path
from aspose.note import Document
path = Path("MyNotes.one")
if not path.exists():
raise FileNotFoundError(f"File not found: {path.resolve()}")
doc = Document(str(path))3. UnicodeEncodeError op Windows bij het afdrukken
Oorzaak: Windows-terminals kunnen een verouderde codering gebruiken die Unicode‑tekens niet kan weergeven.
Oplossing: Configureer stdout opnieuw aan het begin van je script:
import sys
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")4. Lege tekstresultaten
Oorzaak: Het .one-bestand kan leeg zijn, alleen afbeeldingen of tabellen bevatten (geen RichText‑knooppunten), of een notitieboekbestand (.onetoc2) zijn in plaats van een sectiebestand (.one).
Fix: Controleer het aantal pagina’s en inspecteer knooptypen:
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Pages: {len(list(doc))}")
for page in doc:
print(f" Children: {sum(1 for _ in page)}")5. IncorrectPasswordException
Oorzaak: Het .one-bestand is versleuteld. Versleutelde documenten worden niet ondersteund.
Fix: Aspose.Note FOSS voor Python ondersteunt geen versleutelde .one bestanden. Het volledig uitgeruste commerciële Aspose.Note‑product ondersteunt decryptie.
Veelgestelde vragen
Kan ik tekst van alle pagina’s in één keer extraheren?
Ja. doc.GetChildNodes(RichText) doorzoekt de volledige documentboom recursief, inclusief alle pagina’s, outlines en outline‑elementen.
Ondersteunt de bibliotheek .onetoc2 notebookbestanden?
Nee. De bibliotheek verwerkt alleen .one sectiebestanden. Notebook‑inhoudsopgavebestanden (.onetoc2) zijn een ander formaat en worden niet ondersteund.
Kan ik tekst uit tabellen extraheren?
Ja. TableCell knooppunten bevatten RichText kinderen die op dezelfde manier gelezen kunnen worden:
from aspose.note import Document, Table, TableRow, TableCell, RichText
doc = Document("MyNotes.one")
for table in doc.GetChildNodes(Table):
for row in table.GetChildNodes(TableRow):
for cell in row.GetChildNodes(TableCell):
cell_text = " ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
print(cell_text, end="\t")
print()Welke Python‑versies worden ondersteund?
Python 3.10, 3.11 en 3.12.
Is de bibliotheek thread-safe?
Elke Document-instantie moet vanuit één thread worden gebruikt. Voor parallelle extractie, maak een aparte Document per thread aan.
Gerelateerde bronnen: