Kaip išgauti tekstą iš OneNote failų naudojant Python
Microsoft OneNote .one failai yra dvejetainiai dokumentai, kurių negalima skaityti kaip paprasto teksto arba analizuoti su bendriniais XML įrankiais. Aspose.Note FOSS for Python suteikia gryną Python analizatorių, kuris įkelia .one failus į pilną dokumentų objektų modelį (DOM), leidžiantį lengvai išgauti tekstą, formatavimo metaduomenis ir hipersaitus programiškai.
Aspose.Note FOSS naudojimo privalumai Python
- No Microsoft Office required: skaityti
.onefailus bet kurioje platformoje, įskaitant Linux CI/CD serverius - Full text and formatting access: paprastas tekstas, pusjuodžio/šrifto kursyvo/pabraukimo fragmentai, šrifto savybės ir hipersaitų URL
- Free and open-source: MIT licencija, nėra naudojimo mokesčių ar API raktų
Žingsnis po žingsnio vadovas
1 žingsnis: Įdiekite Aspose.Note FOSS for Python
Įdiekite biblioteką iš PyPI. Pagrindinis paketas neturi privalomų priklausomybių:
pip install aspose-notePatikrinkite diegimą:
from aspose.note import Document
print("Installation OK")Žingsnis 2: Įkelti .one failą
Sukurkite Document egzempliorių, perduodant failo kelią:
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Section: {doc.DisplayName}")
print(f"Pages: {len(list(doc))}")Įkelti iš dvejetainio srauto (pvz., iš debesų saugyklos arba HTTP atsakymo):
from aspose.note import Document
with open("MyNotes.one", "rb") as f:
doc = Document(f)Žingsnis 3: Išgauti visą paprastą tekstą
Naudokite GetChildNodes(RichText), kad surinktumėte visus RichText mazgus dokumento medyje. Tai atlieka rekursinę giliojo pirmumo paiešką per visus puslapius, struktūras ir struktūros elementus:
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)Norėdami išsaugoti visą tekstą į failą:
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")Žingsnis 4: Peržiūrėti suformatuotus fragmentus
Kiekvienas RichText mazgas turi TextRuns sąrašą TextRun segmentų. Kiekvienas run neša nepriklausomą TextStyle su formatavimu pagal simbolį:
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}")Žingsnis 5: Išgauti hipersaitus
Hipersaitai saugomi atskiruose TextRun mazguose. Patikrinkite Style.IsHyperlink ir perskaitykite 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}")Žingsnis 6: Ištraukti tekstą iš kiekvieno puslapio
Norint išgauti tekstą, organizuotą pagal puslapio pavadinimą:
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)Dažnos problemos ir sprendimai
1. ImportError: Nėra modulio pavadinimu ‘aspose’
Priežastis: Paketas nėra įdiegtas aktyvioje Python aplinkoje.
Pataisa:
pip install aspose-note
##Confirm active environment:
pip show aspose-note2. FileNotFoundError įkeliant .one failą
Cause: Failo kelias yra neteisingas arba failas neegzistuoja.
Fix: Naudokite absoliutų kelią arba patikrinkite, ar failas egzistuoja prieš įkeliant:
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 Windows operacinėje sistemoje spausdinant
Priežastis: Windows terminalai gali naudoti seną koduotę, kuri negali atvaizduoti Unicode simbolių.
Pataisa: Perkonfigūruokite stdout skripto pradžioje:
import sys
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")4. Tuščio teksto rezultatai
Priežastis: Failas .one gali būti tuščias, jame gali būti tik paveikslėliai arba lentelės (nėra RichText mazgų), arba tai gali būti užrašų knygos failas (.onetoc2), o ne sekcijos failas (.one).
Fix: Patikrinkite puslapių skaičių ir patikrinkite mazgo tipus:
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
Priežastis: Failas .one yra užšifruotas. Užšifruoti dokumentai nepalaikomi.
Fix: Aspose.Note FOSS for Python nepalaiko šifruotų .one failų. Pilnai funkcionalus komercinis Aspose.Note produktas palaiko dešifravimą.
Dažniausiai užduodami klausimai
Ar galiu ištraukti tekstą iš visų puslapių vienu metu?
Taip. doc.GetChildNodes(RichText) ieško viso dokumento medžio rekursiškai, įskaitant visus puslapius, apžvalgas ir apžvalgos elementus.
Ar biblioteka palaiko .onetoc2 užrašų knygos failus?
Ne. Biblioteka apdoroja tik .one sekcijos failus. Užrašų knygos turinio lentelės failai (.onetoc2) yra kitokio formato ir nėra palaikomi.
Ar galiu išgauti tekstą iš lentelių?
Taip. TableCell mazgai turi RichText vaikų, kuriuos galima skaityti taip pat:
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()Kokios Python versijos palaikomos?
Python 3.10, 3.11 ir 3.12.
Ar biblioteka yra gijų saugi?
Kiekviena Document egzempliorius turėtų būti naudojamas iš vienos gijos. Norint atlikti lygiagretų išskyrimą, sukurkite atskirą Document kiekvienai gijai.
Susiję ištekliai: