Hur man extraherar text från OneNote‑filer i Python
Microsoft OneNote .one-filer är binära dokument som inte kan läsas som vanlig text eller analyseras med generiska XML‑verktyg. Aspose.Note FOSS för Python tillhandahåller en ren‑Python‑parser som laddar .one-filer i en fullständig dokumentobjektmodell (DOM), vilket gör det enkelt att programmässigt extrahera text, formateringsmetadata och hyperlänkar.
Fördelar med att använda Aspose.Note FOSS för Python
- Ingen Microsoft Office krävs: läs
.one-filer på vilken plattform som helst, inklusive Linux CI/CD-servrar - Fullständig åtkomst till text och formatering: vanlig text, fet/kursiv/understruken körning, teckensnittsegenskaper och hyperlänk‑URL:er
- Fri och öppen källkod: MIT-licens, inga användningsavgifter eller API‑nycklar
Steg-för-steg-guide
Steg 1: Installera Aspose.Note FOSS för Python
Installera biblioteket från PyPI. Kärnpaketet har inga obligatoriska beroenden:
pip install aspose-noteVerifiera installationen:
from aspose.note import Document
print("Installation OK")Steg 2: Ladda .one-filen
Skapa en Document-instans genom att ange filvägen:
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Section: {doc.DisplayName}")
print(f"Pages: {len(list(doc))}")För att läsa in från en binär ström (t.ex. från molnlagring eller ett HTTP‑svar):
from aspose.note import Document
with open("MyNotes.one", "rb") as f:
doc = Document(f)Steg 3: Extrahera all ren text
Använd GetChildNodes(RichText) för att samla in varje RichText‑nod i dokumentträdet. Detta utför en rekursiv djup‑först‑sökning över alla sidor, konturer och konturelement:
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)För att spara all text till en fil:
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")Steg 4: Inspektera formaterade körningar
Varje RichText nod innehåller en TextRuns lista med TextRun segment. Varje körning bär en oberoende TextStyle med formatering per tecken:
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}")Steg 5: Extrahera hyperlänkar
Hyperlänkar lagras på individuella TextRun noder. Kontrollera Style.IsHyperlink och läs 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}")Steg 6: Extrahera text per sida
För att extrahera text organiserad efter sidtitel:
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)Vanliga problem och lösningar
1. ImportError: Ingen modul med namnet ‘aspose’
Orsak: Paketet är inte installerat i den aktiva Python‑miljön.
Rättelse:
pip install aspose-note
##Confirm active environment:
pip show aspose-note2. FileNotFoundError vid inläsning av .one‑fil
Orsak: Filvägen är felaktig eller filen finns inte.
Fix: Använd en absolut sökväg eller verifiera att filen finns innan den laddas:
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 på Windows vid utskrift
Orsak: Windows-terminaler kan använda en äldre kodning som inte kan rendera Unicode-tecken.
Fix: Omkonfigurera stdout i början av ditt skript:
import sys
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")4. Resultat för tom text
Orsak: Filen .one kan vara tom, innehålla endast bilder eller tabeller (inga RichText‑noder), eller vara en anteckningsfil (.onetoc2) snarare än en sektionsfil (.one).
Fix: Kontrollera sidantalet och inspektera nodtyper:
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
Orsak: Filen .one är krypterad. Krypterade dokument stöds inte.
Fix: Aspose.Note FOSS för Python stöder inte krypterade .one‑filer. Den fullständigt utrustade kommersiella Aspose.Note‑produkten stöder dekryptering.
Vanliga frågor
Kan jag extrahera text från alla sidor på en gång?
Ja. doc.GetChildNodes(RichText) söker igenom hela dokumentträdet rekursivt, inklusive alla sidor, konturer och konturelement.
Stöder biblioteket .onetoc2‑anteckningsfiler?
Nej. Biblioteket hanterar endast .one sektionfiler. Notebookens innehållsförteckningsfiler (.onetoc2) är ett annat format och stöds inte.
Kan jag extrahera text från tabeller?
Ja. TableCell noder innehåller RichText barn som kan läsas på samma sätt:
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()Vilka Python-versioner stöds?
Python 3.10, 3.11 och 3.12.
Är biblioteket trådsäkert?
Varje Document-instans bör användas från en enda tråd. För parallell extraktion, skapa en separat Document per tråd.
Relaterade resurser: