Recenzja MarkItDown: Konwerter plików do Markdown, który nie jest scraperem

Ostatnia aktualizacja: July 17, 2026
Recenzja MarkItDown: Konwerter plików do Markdown, który nie jest scraperem
Podsumowanie AI
Ta recenzja MarkItDown wyjaśnia, że narzędzie Microsoftu służy do konwersji plików do Markdown, a nie do crawlownia stron czy automatyzacji przeglądarki. Autor testuje istniejące wejścia w formatach PDF, DOCX, XLSX i PPTX, a następnie mierzy rozmiar pakietu, czas importu, wierność tabel, czas działania dla różnych rozmiarów dokumentów oraz wzrost zużycia pamięci przez arkusze kalkulacyjne. Artykuł pokazuje, że MarkItDown działa szybko i dobrze na czystych danych, ale ma zaskakująco duży ślad zależności ML oraz potrafi zachować tekst tabel, jednocześnie po cichu gubiąc strukturę kolumn. To praktyczny przewodnik dla zespołów, które chcą zamieniać dokumenty na Markdown na potrzeby wyszukiwania, RAG albo wewnętrznych baz wiedzy.

MarkItDown często wrzuca się do jednego worka z web scraperami — i to jest mylne skojarzenie. Nie ma tam żadnego crawlera, silnika JavaScript ani mechanizmu, który pobiera URL i czyści stronę z niepotrzebnych elementów. Jego zadanie jest inne: bierze dane, które już masz — PDF-a, dokument Word, arkusz kalkulacyjny, prezentację — i zamienia je na Markdown, który potrafi odczytać model językowy.

Przez kilka tygodni uruchamiałem Microsoft MarkItDown na zestawie prawdziwych dokumentów na jednym Macu, oceniając każdą tabelę względem manifestu przygotowanego przed testem i mierząc czas każdej konwersji. Krótko mówiąc: na czystych danych działa szybko i wiernie, w pakiecie ukrywa 73 MB środowiska uczenia maszynowego, którego nikt nie zamawiał, a tabele psują się w sposób, który przechodzi test „czy tekst przetrwał?”, ale oblewa test „czy dane są w odpowiedniej kolumnie?”. Poniżej pełny obraz wraz z liczbami.

Czym właściwie jest MarkItDown

MarkItDown to narzędzie w Pythonie stworzone przez Microsoft, które konwertuje pliki i dokumenty Office do Markdown zoptymalizowanego pod LLM-y. Wskazujesz mu PDF, .docx, .xlsx, .pptx, obraz, plik HTML albo kilka innych formatów, a ono zwraca Markdown. Można z niego korzystać na trzy sposoby: przez CLI (markitdown file.pdf -o out.md albo przez stdin), przez API Pythona (MarkItDown().convert(...)) oraz opcjonalnie przez serwer MCP do workflow agentowych.

MarkItDown converts existing files to Markdown and is not a crawler

Najważniejsze jest jednak to, czego to narzędzie nie robi — i właśnie dlatego, że README tego nie obiecuje, a testy to potwierdziły: nie crawluje, nie renderuje JS, nie podąża za linkami, nie obsługuje paginacji i nie wyciąga głównej treści w stylu narzędzi do czytelnego artykułu. To konwerter całych dokumentów. Dostarczasz bytes, a on je normalizuje. To właśnie ta różnica decyduje, czy to narzędzie pasuje do Twojego stacku, czy nie — dlatego będę do niej wracać.

Sam repozytorium robi wrażenie według githubowych wskaźników popularności — 165 282 gwiazdki i 11 790 forków w połowie lipca 2026 roku, licencja MIT, a najnowsze wydanie (v0.1.6) pojawiło się 2026-05-26. Tyle że ten wynik to raczej efekt ogólnego entuzjazmu wokół narzędzi dla LLM-ów i faktu, że repo należy do Microsoftu, niż sygnał dojrzałości samego silnika konwersji. Jest też 833 otwartych issue, a część z nich ma znaczenie jeszcze zanim zainstalujesz narzędzie — więcej o tym poniżej.

HTML do Markdown: szybko, kompletnie, z boilerplate’em w pakiecie

Ponieważ reszta mojej serii testów scraperów opiera się na tych samych czterech webowych fixture’ach, podałem MarkItDown identyczne lokalne pliki HTML — nie po to, by oceniać go jak scraper, ale żeby sprawdzić, jak dobra jest jego konwersja HTML do Markdown. Na dobrze opisanych stronach radzi sobie naprawdę dobrze.

Wszystkie cztery strony przeszły przez podstawową instalację bez dodatkowych zależności, a każdy test na treści głównej się udał. Artykuł Wikipedii o „Web scraping” (226 KB) został odtworzony z zachowaniem struktury nagłówków — jedno h1, siedem h2 i dwanaście h3, zgodnie z rzeczywistą strukturą sekcji — a 418 linków pozostało poprawnie zapisanych jako [tekst](url). Tabela statystyk hokejowych 26×9 na stronie Scrape This Site forms page została zamieniona w czystą tabelę GFM typu pipe, z 27 wierszami (nagłówek + separator + 26 wierszy danych), łącznie z pustymi komórkami. Czas też nie stanowił problemu: mediana wyniosła 48 ms dla małej strony z cytatami i 352 ms dla strony Wikipedii o rozmiarze 226 KB.

Jest jednak haczyk — i to bardziej decyzja projektowa niż błąd. MarkItDown nie usuwa boilerplate’u. Konwertuje cały <body>, więc elementy „site chrome” przechodzą razem z treścią, a ich udział rośnie wraz z ilością takich dodatków na stronie.

StronaLiczba znaków wyjściowychNagłówki (h1/h2/h3)LinkiLinie interfejsu strony
Books to Scrape10,4781 / 0 / 0940.6% (1/159)
Quotes to Scrape2,9731 / 1 / 0551.2% (1/86)
ScrapeThisSite forms3,3851 / 0 / 0316.7% (5/75)
Wikipedia Web scraping60,1591 / 7 / 1241812.4% (42/338)

Na niemal pozbawionej elementów interfejsu stronie głównej Books tylko 0,6% linii wyjściowych to chrome. Na Wikipedii to już 12,4% — 42 z 338 niepustych linii to „jump to content”, „toggle the table of contents”, „22 languages”, „retrieved from”, stopki cookies i licencji. Te komunikaty konserwacyjne Wikipedii („This article needs additional citations”) również trafiają wiernie do dwukolumnowych tabel pipe, i stąd na stronie bez prawdziwej tabeli danych pojawia się dziewięć wierszy tabeli.

To nie jest błąd MarkItDown. To konwerter całych dokumentów, a nie ekstraktor czytelnej treści. Wierna konwersja HTML do Markdown to inne zadanie niż czyste wydobywanie artykułu. Trafilatura i narzędzia w stylu Firecrawl mają zwracać tylko główną treść; MarkItDown zwraca całą stronę. W środku _html_converter.py usuwa tylko <script> i <style>, a potem przekazuje cały body do biblioteki markdownify — bez żadnej heurystyki głównej treści. Jeśli chcesz sam artykuł, to jest zła warstwa.

Naturalne środowisko: PDF, DOCX, XLSX, PPTX

Dokumenty to właśnie to, do czego MarkItDown został stworzony. Przetestowałem go na prawdziwych publicznych plikach — artykule z arXiv z warstwą tekstową, białej księdze Bitcoina, zeskanowanym PDF-ie zawierającym wyłącznie obraz, wyrenderowanym tak, by nie miał żadnego tekstu, oraz plikach DOCX/XLSX/PPTX z własnego zestawu testowego MarkItDown (z losowymi UUID, żeby wykryć cichą utratę treści).

DokumentWejścieLiczba znaków wyjściowychTrafione testyMediana czasuUwagi
arXiv 1706.03762 (PDF z warstwą tekstową)2.2 MB40,1747/73.7 s (warm)tytuł, „Transformer”, „BLEU”, „References” obecne
Whitepaper Bitcoina (9 str. PDF)184 KB22,4856/61.4 s„Satoshi Nakamoto”, „proof-of-work”, „Conclusion” obecne
Skanowany PDF (bez warstwy tekstowej)89 KB00/415 mspuste wyjście, brak błędu, brak OCR
DOCX (test.docx)136 KB4,65170 msnagłówki + tabela GFM; UUID przechodzą bez strat
DOCX z równaniami15 KB240101 msOffice Math zachowany jako LaTeX
XLSX (test.xlsx)12 KB80857 mskażdy arkusz → ## SheetName + tabela GFM
PPTX (test.pptx)278 KB2,04752 msznaczniki numerów slajdów, tabele, wykres → tabela

W PDF-ach z warstwą tekstową trafność odczytu była świetna — 7 z 7 wcześniej zdefiniowanych testów w artykule arXiv „Attention Is All You Need”, 6 z 6 w whitepaperze Bitcoina — a żaden z plików Office nie zgubił ani jednego UUID, więc na własnych fixture’ach regresyjnych maintainerów nie było cichej utraty treści. Jest też miły, wąski sukces: ścieżka DOCX (przez mammoth) zachowuje równania Office Math jako LaTeX, zamieniając equations.docx w prawdziwe formuły $$...$$. Jeśli karmisz model językowy dokumentami Word z dużą ilością matematyki, to jest realna, choć bardzo konkretna przewaga, której nie udało mi się znaleźć opisanej gdzie indziej.

Dwa wyniki z tej części zasługują na osobne omówienie, bo to właśnie one najpewniej sprawią Ci kłopot.

Skanowany PDF, który znika

Jeśli podasz MarkItDown PDF-a będącego wyłącznie obrazem, bez warstwy tekstowej, dostaniesz pusty string. Zero znaków, bez wyjątku, bez ostrzeżenia — konwersja trwa około 15 ms, bo nie ma czego wyciągać. Ścieżka PDF w MarkItDown służy tylko do ekstrakcji tekstu (pod spodem działa pdfminer i pdfplumber), a OCR nie jest częścią ani podstawowej instalacji, ani żadnego dodatku pip.

To ważne przy przetwarzaniu wsadowym. Programista wrzucający folder PDF-ów, z których część to skany, dostaje dla tych plików po cichu puste wyniki, bez żadnego sygnału, że coś zostało pominięte. Sprawdziłem, czy fixture nie jest uszkodzony, uruchamiając bezpośrednio extract_text z pdfminera — wynik był zerowy, bez obciętych znaków, bez warstwy tekstowej, potwierdzone. Czyli puste wyjście to rzeczywiste zachowanie MarkItDown na prawdziwym skanie. To odtwarza długo otwartą lukę w fallbacku OCR (#1268), śledzoną upstream od dłuższego czasu. Oficjalna ścieżka to opcjonalny backend Azure Document Intelligence albo plugin; żaden z nich nie znajduje się w instalacji domyślnej.

PDF-y wychodzą jako płaski tekst, nie struktura

W obu testowanych PDF-ach z warstwą tekstową MarkItDown nie wygenerował ani jednego znacznika nagłówka Markdown. PDF nie zawiera semantycznych tagów nagłówków, a MarkItDown nie wyciąga ich z wielkości fontu, więc każda linia trafia na poziom body. Trafność tekstu jest wysoka; struktura jest płaska.

To nie tylko mój wynik. Publiczne benchmarki zewnętrzne oceniają hierarchię nagłówków PDF w MarkItDown na około 0,0, a wierność tabel na mniej więcej 0,27, czyli znacznie poniżej 0,88 osiąganego przez Docling z TableFormer (zob. porównanie MarkItDown vs Docling vs Marker oraz benchmark READoc). Moje testy odtwarzają te wyniki, co wzmacnia wiarygodność danych — moje liczby zgadzają się z zewnętrznym źródłem. Ten sam zestaw benchmarków pokazuje też kompromis: MarkItDown działa około 100× szybciej niż Docling, co zgadza się z moimi pomiarami w sekundach, a nie minutach, dla dokumentów, które narzędzia modelowe analizujące układ strony obrabiają przez dłuższy czas. Wniosek: MarkItDown daje czysty, szybki tekst z PDF-a, ale nie daje struktury PDF-a. Jeśli nagłówki i tabele muszą przetrwać, właściwą warstwą jest narzędzie oparte na modelu układu, takie jak Docling lub Marker.

Tabele: treść zawsze przechodzi, struktura już niekoniecznie

Tabele to miejsce, w którym „czy tekst przetrwał?” i „czy dane da się użyć?” zaczynają oznaczać dwie różne rzeczy, więc zbudowałem macierz 13 przypadków — jedna <table> na przypadek, każdy oceniany względem manifestu napisanego przed uruchomieniem — żeby dokładnie zobaczyć, które kształty się utrzymują, a które się psują.

MarkItDown table fidelity: tokens survive but rowspan can silently shift columns

Najważniejszy wniosek: MarkItDown nigdy nie zgubił zawartości tabel. We wszystkich 13 przypadkach zachował 100% wcześniej zdefiniowanych tokenów. Ale wierność strukturalna rozbiła się na trzy kategorie. Siedem z trzynastu dało poprawną siatkę GFM (zwykła, z colspan w nagłówku, szeroka na 24 kolumny, bez nagłówka, z pustymi komórkami, blok w komórce i arabska z kierunkiem RTL). Cztery wyszły krzywo, bo Markdown nie ma pojęcia o komórkach rozciągniętych — więc rowspan, colspan i uszkodzone źródła generują krótkie wiersze. A dwa przypadki były po prostu zepsute.

Te dwa błędy warto nazwać wprost. Zagnieżdżona tabela (<table> wewnątrz <td>) zostaje spłaszczona inline, a jej własne pionowe kreski i wiersz separatora lądują w komórce nadrzędnej, tworząc śmieciowy wiersz „14-kolumnowy”. Z kolei dosłowny znak | w komórce nie jest escapowany — tekst a | b staje się dwiema kolumnami, a x || y trzema — więc dwukolumnowa tabela może zwrócić wiersze z dwiema, trzema i czterema kolumnami, a każdy parser Markdown odczyta błędne granice. Co ciekawe, gwiazdki i backticki w komórce są escapowane; po prostu pionowe kreski nie. Przyczyna jest taka, że ścieżka HTML w MarkItDown korzysta z domyślnej obsługi tabel w markdownify, a jego własna klasa potomna nadpisuje linki, obrazy i nagłówki, ale nie komórki tabel. Ten sam problem z escapowaniem pipe’ów jest otwartym issue dla konwertera CSV (#2019), choć ta poprawka nie dotyczy ścieżki HTML, którą tutaj testowałem.

Najbardziej podstępny wynik — ten, który szczególnie chciałbym pokazać inżynierowi danych — dotyczy rowspan. Przypadek t03 nie tylko wychodzi krzywo; on po cichu rozjeżdża dane. Etykieta z rowspan=2 („Fruit”) pojawia się tylko raz, a wiersz pod nią staje się krótkim dwukolumnowym wierszem (| Banana | 8 |), więc „Banana” trafia pod kolumnę Group zamiast Item. Wszystkie tokeny są obecne. Naiwny konsument, który „po prostu czyta drugą kolumnę”, dostanie złą wartość. To właśnie ten typ błędu, który przechodzi test zachowania tekstu, a cicho psuje zbiór danych.

Samo ograniczenie dotyczące spanów jest znanym, śledzonym ograniczeniem projektowym (#1211, #1248) — płaska siatka GFM po prostu nie potrafi reprezentować spanów ani zagnieżdżeń, więc konwerter wymienia strukturę na pełność treści. Są też dobre zachowania: tabele bez nagłówka dostają syntetyczny pusty wiersz nagłówka (żaden rekord nie zostaje po cichu awansowany do nagłówka), puste komórki są zachowane, a <caption> przechodzi jako linia tekstu nad tabelą.

Instalacja i start: koszt, o którym „lekki util” nie uprzedza

Nic nie zaskoczyło mnie tu bardziej — i właśnie tutaj określenie „lekki Python utility” cicho obiecuje zbyt wiele.

MarkItDown dependency footprint: 161 MB total, onnxruntime 73 MB and numpy 34 MB

Po pierwsze, nie uruchamiaj pip install 'markitdown[all]'. Na Pythonie 3.14 ta komenda po cichu cofa się do markitdown 0.0.2 — wydania sprzed dwóch lat — co odtworzyłem na czystym venv. Przy przypięciu wersji widać, dlaczego: pip install 'markitdown[all]==0.1.6' kończy się błędem, ponieważ dodatkowy pakiet [all] przypina youtube-transcript-api~=1.0.0, a na obecnym PyPI wszystkie buildy z tego zakresu wymagają Pythona <3.14, podczas gdy jedyne buildy zgodne z 3.14 wypadają poza to przypięcie. Resolver cofa się więc aż do ostatniego wydania, którego zależności da się spełnić. To zgadza się z otwartym issue upstream (#2179). Rozwiązanie jest proste: przypnij wersję i instaluj dodatki osobno: pip install 'markitdown==0.1.6', a potem pip install 'markitdown[pdf,docx,pptx,xlsx,xls]==0.1.6'. Każdy z tych pakietów rozwiązuje się poprawnie; tylko połączony zestaw [all] zawiera wadliwe przypięcie. (Ta pułapka zależy od wersji Pythona — na Pythonie 3.13 lub starszym ograniczenie może nie zadziałać, więc [all] może rozwiązać się inaczej.)

Po drugie, rozmiar. Podstawowa instalacja zajmuje 161 MB (puste venv 13 MB + 148 MB). Z tego onnxruntime (73 MB) i numpy (34 MB) razem dają 107 MB — czyli 66% całego podstawowego śladu — i oba trafiają tam przez jedną twardą zależność: magika, detektor typu pliku od Google oparty na ML. Czyli konwerter tekstu dostaje w bazowej instalacji 73 MB runtime’u ONNX, zanim dołożysz choćby jeden dodatek dokumentowy. Po dodaniu dodatków związanych z dokumentami środowisko rośnie do 310 MB. To i tak znacznie lżejsze niż stack z headless browserem, ale jeśli spodziewałeś się mikronarzędzia typu „pip install i gotowe”, warto wiedzieć, że ONNX runtime jedzie w komplecie.

Po trzecie — i to jedyny wynik z całego pakietu, który przechodzi każdy test nowości, jaki wykonałem — nawet po czystej instalacji import markitdown kosztuje około 3,35 sekundy na tej maszynie. Prawie cały koszt pojawia się przy imporcie: markitdown._markitdown eagerly importuje cały rejestr konwerterów (łączny koszt 2,56 s, czyli 76% całości), co wciąga pandas (594 ms, przez konwerter XLSX), python-pptx (427 ms), magika (354 ms) i requests (270 ms) — niezależnie od tego, czy w ogóle konwertujesz te formaty. W długotrwałej usłudze ten koszt się amortyzuje i przestaje mieć znaczenie. W CLI albo przy cold starcie w serverless to realny podatek per proces, którego etykieta „lekki util” nie sugeruje. (Uczciwe zastrzeżenie: to pojedynczy profilowany przebieg, traktowany jako jedna obserwacja, a nie rozkład z wielu testów.)

MarkItDown cold start import tax: 3.35 seconds, registry 2.56 seconds

Skala: nie crashuje, ale dla PDF-ów zaplanuj CPU, a dla arkuszy pamięć

Przepchnąłem przez niego cztery duże przypadki, każdy w osobnym procesie, żeby pamięć szczytowa nie była zanieczyszczona wcześniejszym uruchomieniem. Nic się nie wysypało. Profil kosztów jest jednak mocno nierówny.

MarkItDown timing scale: arXiv 3.7 seconds, NIST 192.5 seconds, 50K XLSX plus 374 MB

TematWejścieLiczba znaków wyjściowychMediana czasuSzczytowy wzrost RSS
NIST SP 800-53r5 (PDF 492 strony)5.9 MB1,625,365192.5 s+40 MB
XLSX 50 000 wierszy × 8 kol.2.1 MB3,722,95562.1 s+374 MB
arXiv 1706.03762 (~15-stronicowy PDF)2.2 MB40,17412.6 s+25 MB
XLSX 200 wierszy × 64 kol.46 KB120,1292.9 s+22 MB

492-stronicowy PDF NIST zajął medianę 192,5 sekundy — około 3,2 minuty, czyli 0,39 s/stronę — ponieważ pdfplumber uruchamia wykrywanie układu formularzy oparte na pozycjach słów na każdej stronie. Szczytowy RSS zatrzymał się na +40 MB, więc to problem CPU, nie pamięci. Nawet 15-stronicowy PDF z arXiv zajął 12,6 sekundy w osobnym, izolowanym procesie, czyli około 3,4× dłużej niż te same dane pokazane „na ciepło” w moim zestawie dokumentów. Ta różnica to koszt zimnego procesu i potwierdza, że głównym czynnikiem jest praca wykonywana per strona, a nie sam rozmiar pliku. Jeśli chcesz jedną przenośną liczbę dla tego PDF-a, użyj izolowanych 12,6 s.

Ścieżka arkuszy kalkulacyjnych ma odwrotny bottleneck. XLSX o wielkości 2,1 MB i 50 000 wierszy wystrzelił do +374 MB szczytowego RSS (oraz 3,7 miliona znaków wyjścia), bo konwerter ładuje cały arkusz i buduje jeden ogromny string Markdown w pamięci. W praktyce oznacza to prostą zasadę: dla dużych PDF-ów licz CPU w minutach; dla dużych arkuszy licz pamięć w setkach MB. To są wyniki z jednej maszyny na macOS arm64 i Pythonie 3.14, więc konkretne wartości per strona i per wiersz są zależne od platformy — ale ogólny kształt (PDF jest wolny i CPU-bound, XLSX pożera pamięć, nic się nie crashuje) przenosi się bardzo dobrze.

Gdzie pasuje Thunderbit — a gdzie nie

Wypróbuj Thunderbit do ekstrakcji danych z sieci

To porównanie łatwo byłoby wyolbrzymić, więc wyznaczę granicę ostrożnie. MarkItDown i Thunderbit rozwiązują sąsiednie problemy, ale nie ten sam.

MarkItDown konwertuje pliki, które już masz. Thunderbit najpierw pobiera stronę. Punkt /distill w Thunderbit zamienia aktywną stronę WWW w czysty Markdown gotowy dla LLM-ów — obsługując renderowanie JS, antyboty i dynamiczną treść, z którymi MarkItDown nie ma jak sobie poradzić — a endpoint /extract zwraca dopasowany do schematu uporządkowany JSON, nie tylko surowy Markdown. Dla developerów jest to dostępne przez API (POST /distill / POST /extract), serwer MCP i CLI (npx @thunderbit/thunderbit-cli) działające na jednym silniku AI — tym samym, który stoi za rozszerzeniem z ponad 100 000 użytkowników.

Nakładanie się jest więc tylko w jednym punkcie — oba narzędzia mogą generować „LLM-ready Markdown” — ale domena wejściowa jest inna: Thunderbit distill działa na URL-u z otwartego internetu, a MarkItDown na lokalnym pliku. Nie są zamiennikami jeden do jednego i nie będę udawać, że są. Realistyczny stack używa obu: pobierasz i crawl’ujesz web przez Thunderbit (albo usługę w stylu Firecrawl), a następnie normalizujesz lokalne dokumenty, które też posiadasz — PDF-y, prezentacje i arkusze — za pomocą MarkItDown. Jedno obsługuje sieć; drugie obsługuje szafkę z plikami.

Plusy i minusy

Mocne strony

  • Pełne odzyskiwanie treści z czystego HTML (4/4 strony), z wiernie zachowaną hierarchią nagłówków i linkami
  • Wysoka trafność tekstu z PDF/DOCX (arXiv 7/7 testów, Bitcoin 6/6) i brak cichej utraty treści na własnych fixture’ach Office
  • Równania Office Math zachowane jako LaTeX — realny, niszowy plus
  • Nie wysypał się na żadnym testowanym obiekcie, aż do 492-stronicowego PDF-a i XLSX z 50 tys. wierszy
  • Prosty w użyciu: CLI, convert(), stdin piping i opcjonalny serwer MCP
  • Licencja MIT, aktywnie utrzymywany przez Microsoft, responsywny tracker issue

Słabe strony

  • Zachowuje boilerplate — na Wikipedii nawet do 12,4% linii to chrome; to nie jest extractor artykułów
  • Tabele psują się przy spanach, zagnieżdżeniach i pionowych kreskach w komórkach (2/13 zepsute, 4/13 krzywe), a rowspan może po cichu przesunąć dane do złej kolumny
  • Skanowane PDF-y / obrazy bez warstwy tekstowej zwracają puste wyjście bez OCR i bez błędu
  • Wyjście PDF ma zerową strukturę nagłówków (zgodnie z publicznymi benchmarkami)
  • Podstawowa instalacja waży 161 MB i ciągnie 73 MB runtime’u ONNX; ~3,35 s zimnego importu
  • Dodatkowy pakiet [all] na Pythonie 3.14 po cichu cofa instalację do 0.0.2 sprzed dwóch lat

Dla kogo to jest, a dla kogo nie

Sięgnij po MarkItDown, jeśli chcesz ujednolicić dużą paczkę lokalnych dokumentów — Word, Excel, PowerPoint, PDF-y z warstwą tekstową — do Markdown w pipeline dla LLM-a i bardziej zależy Ci na kompletności tekstu niż na zachowaniu struktury. Jako ostatni etap wsadowego przetwarzania, który podaje modelowi czysty tekst, działa szybko, wiernie i za darmo.

Pomiń go albo połącz z innym narzędziem, jeśli Twoje zadanie wygląda inaczej: potrzebujesz tylko głównego artykułu ze strony WWW (użyj narzędzia do czytelnej treści albo czegoś w stylu Firecrawl); potrzebujesz, by nagłówki i tabele z PDF-a przetrwały w nienaruszonej formie (to obszar Docling albo Marker); albo Twoje wejścia zawierają zeskanowane dokumenty wymagające OCR (potrzebny będzie backend Azure albo zupełnie inne narzędzie). A jeśli szukałeś scrapera — czyli czegoś, co pobiera strony i je crawluje — to to nie jest to.

Wstępna ocena, którą zrobiłem na rubryce przypominającej scraper, daje MarkItDown 60/100, ale ten niski wynik to efekt oceniania konwertera według testów dla crawlera. Na własnym polu jego wyniki w zachowaniu tekstu są wysokie; słabsze punkty są strukturalne (tabele, nagłówki PDF) i związane z pakowaniem (waga, import, pułapka [all]), a nie z jakością tekstu. Jeśli oceniasz go za to, czym jest — konwerter plików do Markdown — to dostajesz solidne, dobrze utrzymane narzędzie z kilkoma ostrymi krawędziami, o których warto wiedzieć, zanim włączysz je do produkcji.

Najczęściej zadawane pytania

Czy MarkItDown to web scraper?

Nie. Nie ma crawlera, renderowania JavaScript, podążania za linkami ani paginacji. Konwertuje pliki i dokumenty, które już masz — PDF, DOCX, XLSX, PPTX, obrazy, HTML — do Markdown. Jeśli potrzebujesz pobierać i crawlować strony internetowe na żywo, potrzebujesz narzędzia do scrapingu, takiego jak Thunderbit albo Firecrawl; MarkItDown to krok wykonywany później, gdy już pobrane lub lokalne pliki trzeba zamienić na czysty Markdown.

Dlaczego pip install markitdown[all] instaluje starą wersję?

Na Pythonie 3.14 dodatek [all] przypina youtube-transcript-api~=1.0.0, a każda wersja z tego zakresu wymaga Pythona starszego niż 3.14. Resolver nie jest w stanie spełnić tego ograniczenia, więc po cichu cofa się do markitdown 0.0.2, wydania sprzed dwóch lat. Rozwiązanie: przypnij wersję i instaluj dodatki osobno: pip install 'markitdown==0.1.6', a potem dodaj 'markitdown[pdf,docx,pptx,xlsx,xls]==0.1.6'. Jest to śledzone jako issue #2179.

Czy MarkItDown robi OCR na zeskanowanych PDF-ach?

Nie w domyślnej instalacji. Jego ścieżka PDF służy tylko do ekstrakcji tekstu, więc PDF będący samym obrazem i bez warstwy tekstowej zwraca pusty string — bez błędu, bez ostrzeżenia. OCR wymaga opcjonalnego backendu Azure Document Intelligence albo pluginu, z których żaden nie jest dostępny domyślnie. To długo śledzona luka (issue #1268).

Jak MarkItDown radzi sobie z tabelami?

Pod względem treści bardzo dobrze — w moim teście 13 przypadków zachował 100% zawartości tabel w każdym z nich. Strukturalnie zależy to od kształtu: proste, szerokie, beznagłówkowe i z pustymi komórkami tabele wychodzą jako czyste siatki GFM, ale rowspan i colspan robią się nierówne (a rowspan może po cichu przesunąć dane do złej kolumny), zagnieżdżone tabele spłaszczają się do śmieciowych wierszy, a dosłowne znaki pipe w komórkach nie są escapowane. Płaski format tabel w Markdown po prostu nie potrafi reprezentować spanów ani zagnieżdżeń.

Czy MarkItDown jest wystarczająco szybki dla dużych dokumentów?

Nie crashuje na dużych plikach, ale trzeba planować zasoby zależnie od typu pliku. PDF o długości 492 stron zajął około 3,2 minuty (mniej więcej 0,39 s/stronę), bo robi detekcję układu na każdej stronie i jest CPU-bound. Arkusz z 50 000 wierszy skończył się po około minucie, ale zużył dodatkowe 374 MB RAM, ponieważ buduje jeden duży string Markdown w pamięci. Dla dużych PDF-ów planuj minuty CPU; dla dużych arkuszy planuj setki MB pamięci.

Wypróbuj Thunderbit do ekstrakcji danych z sieci Get Started Free

Ke
Ke
CTO w Thunderbit | Starszy data scientist i ekspert ML Dzięki prawie dziesięciu latom doświadczenia w uczeniu maszynowym i data science, Ke Shen jest absolwentem Columbia University i byłym starszym data scientistą w Walmart Labs. Dysponując dogłębną, uznaną przez branżowych ekspertów wiedzą w zakresie Python, R, Java i statystyki, dzieli się sprawdzonymi w boju spostrzeżeniami na temat wdrażania złożonych algorytmów AI — od teorii po architekturę gotową do produkcji.

Wypróbuj Thunderbit

Zbieraj leady i inne dane w zaledwie 2 kliknięcia. Wspierane przez AI.

Pobierz Thunderbit To darmowe
Wyciągaj dane z użyciem AI
Łatwo przenoś dane do Google Sheets, Airtable lub Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week