Benchmark markdownify: Akurasi Tabel dalam 1,8 MiB

Terakhir diperbarui pada August 17, 2026
Benchmark markdownify: Akurasi Tabel dalam 1,8 MiB
Ringkasan AI
Pada empat fixture HTML yang dibagikan bersama markitdown, markdownify menghasilkan jumlah baris tabel Markdown yang keluar sama menurut pengukur kami — 36 berbanding 36 — dan berhasil memulihkan seluruh 16 string konten yang diuji. Output-nya sebanyak 21.062 token memang menjadi yang paling rendah secara nominal, meski tiga konverter teratas selisihnya hanya dalam 1,3%. Aplikasinya terpasang dengan ukuran 1,8 MiB, berlisensi MIT, dan saat snapshot memiliki 2.235 bintang GitHub. Ini adalah library yang paling jarang dibahas di kategori ini, dan berdasarkan angka-angka tersebut, yang paling layak saya pilih. Mulailah dengan markdownify untuk workload Python yang mirip fixture ini.

Pada empat fixture HTML yang dibagikan bersama markitdown, markdownify menghasilkan jumlah baris tabel Markdown yang keluar sama menurut pengukur kami — 36 lawan 36 — dan berhasil memulihkan seluruh 16 string konten yang diuji. Output-nya sebanyak 21.062 token memang yang paling rendah secara nominal, meski tiga konverter teratas selisihnya cuma 1,3%. Aplikasinya terpasang dengan ukuran 1,8 MiB, berlisensi MIT, dan saat snapshot memiliki 2.235 bintang GitHub.

Ini adalah library yang paling jarang dibahas di kategori ini, dan berdasarkan angka-angka tersebut, justru yang paling layak saya pilih.

Apa itu markdownify

markdownify adalah konverter HTML ke Markdown untuk Python yang dibangun di atas BeautifulSoup. Arsitekturnya sesederhana itu: parse dengan BeautifulSoup, telusuri tree, lalu keluarkan Markdown. Versi yang diuji: 1.2.3, lisensi MIT, 2.235 bintang, 42 isu terbuka, rilis terakhir 2026-06-30 — masih aktif dipelihara, total 44 rilis.

Referensi resmi: repositori resmi python-markdownify.

System diagram: HTML to Markdown Path

API-nya cuma satu fungsi:

from markdownify import markdownify
md = markdownify(html)

Ada juga bentuk class (MarkdownConverter) kalau Anda ingin menimpa cara elemen tertentu diproses, plus beberapa opsi yang cukup lengkap — gaya heading, karakter bullet, deteksi bahasa pada kode, dan penghapusan elemen. Namun, pemakaian paling umum tetap satu baris di atas, dan itu bekerja dengan baik.

pip install markdownify menarik 5 paket dan 1,8 MiB, lalu cold import dalam 0,046 s — yang paling ngebut di antara tiga konverter yang saya uji. Pohon dependensinya adalah BeautifulSoup dan komponen pendampingnya yang biasa, yang di banyak proyek Python sebenarnya sudah ada, jadi biaya tambahannya sering kali nyaris nol.

Metodologi pengukuran

Saya menjalankannya pada empat fixture HTML yang sebelumnya juga dipakai oleh paket lain di baseline ini untuk markitdown, dengan probe string yang sudah terdaftar sebelumnya — 16 string isi badan yang diuji apakah tetap muncul, ditambah pemeriksaan boilerplate untuk elemen chrome halaman. Fixture kelima, Nothing but tables, adalah diagnostic terpisah yang sangat berat pada tabel dan tidak dimasukkan ke agregat empat fixture di bawah.

KonverterProbe isiKarakter outputToken (o200k)Baris tabel MarkdownLink
markdownify16/1676.86821.06236599
html2text16/1676.45221.17632545
markitdown16/1676.99521.33636598
turndown16/1695.18826.2360611

fourway-scores.json. Empat fixture, token dihitung dengan o200k_base, baris tabel dihitung dengan satu aturan yang sama untuk keempatnya — termasuk penghitungan ulang output tersimpan milik markitdown, yang hasilnya persis sama dengan angka yang dipublikasikan.

Ada tiga hal yang paling menonjol.

Hasilnya imbang dengan markitdown untuk jumlah baris tabel yang keluar. 36 baris masing-masing pada empat fixture yang sama, dihitung dengan heuristik yang sama. Ini tidak membuktikan kesetaraan sel per sel; ini cuma berarti kedua output menampilkan jumlah baris tabel Markdown yang bisa dikenali sebanyak itu kepada penghitung kami.

Jumlah token-nya paling rendah. 21.062, sedikit di bawah html2text yang 21.176 dan markitdown yang 21.336, serta 19,7% lebih rendah daripada turndown yang 26.236. Tiga teratas selisihnya cuma 1,3%, jadi saya akan menyebutnya seri, bukan menang; selisih yang benar-benar terasa ada saat dibandingkan dengan turndown.

Semua probe konten lolos. Semua 16. Tiga konverter lain juga begitu — jadi untuk ketahanan isi, di sini tidak ada perbedaan besar.

Tabel yang ditanganinya dengan benar

Fixture statistik hoki adalah tempat konverter mulai kelihatan beda. markdownify:

| Team Name | Year | Wins | Losses | OT Losses | Win % | ... |
| --- | --- | --- | --- | --- | --- | --- |
| Boston Bruins | 1990 | 44 | 24 |  | 0.55 | ... |

Format GFM standar dengan pipe di awal dan akhir, baris pemisah, dan — perhatikan sel kosong di antara 24 dan 0.55ia tetap mengeluarkan sel kosong itu alih-alih melewatinya. Kedengarannya sepele, padahal tidak: konverter yang menghapus sel kosong akan menggeser semua nilai setelahnya ke kolom yang salah, tetapi hasilnya masih terlihat seperti tabel yang valid.

System diagram: Preserve Table Meaning

turndown pada input yang sama mengubah setiap nilai menjadi paragraf terpisah tanpa struktur kolom sama sekali. html2text menghasilkan tabel yang benar dengan gaya berbeda, tanpa pipe luar.

Kalau Markdown itu akan masuk ke model, pipe dan sel kosong yang dipertahankanlah yang membuatnya bisa menjawab "berapa kali Boston kalah" alih-alih nebak-nebak.

Dua hal yang ia buang, tetapi turndown tidak

Akurasi tabel adalah perbedaan yang paling kelihatan. Yang satu ini lebih besar, dan hampir tidak ada yang membahasnya.

markdownify menghapus konten <script> dan <style>. turndown tidak. Diukur lewat penanda yang hanya muncul di dalam elemen-elemen itu, output markdownify di seluruh fixture mengandung nol marker script dan nol marker style; output turndown mengandung 10 dan 84. Pada fixture Wikipedia, itu berarti perbedaan antara 59.561 karakter dan 74.939 — dan delapan baris konfigurasi JavaScript inline dan CSS milik MediaWiki menyumbang 14.644 karakter, alias 95% dari selisih itu (script-style-stripping.json).

Buat apa pun yang memberi makan model, ini bagian paling mahal dari seluruh perbandingan: blob konfigurasi JavaScript menghabiskan token tetapi tidak membawa informasi sama sekali. markdownify menghapusnya tanpa diminta. html2text juga begitu.

Per fixture, markdownify dan html2text cocok persis saat tabelnya sederhana, lalu mulai beda saat strukturnya tidak sederhana:

Fixturemarkdownifyhtml2text
Statistik hoki27 baris27 baris
Wikipedia9 baris5 baris
Nothing but tables (diagnostic terpisah)62 baris59 baris

markdownify menghasilkan lebih banyak baris yang dikenali pada dua perbandingan diagnostik. Khusus di Wikipedia, ia mempertahankan sembilan baris sementara html2text hanya lima menurut penghitung ini. Ini jadi peringatan yang berguna untuk mengecek tabel bertingkat dan tidak beraturan yang representatif sebelum memilih, bukan bukti bahwa setiap sel yang keluar pasti semantik-nya benar.

Instalasi dan lisensi, dibanding alternatif

LibraryPaketUkuran diskCold importLisensiBintangRilis terakhir
markdownify51,8 MiB0,046 sMIT2.2352026-06-30
html2text10,2 MiB0,077 sGPL-3.0-or-later2.1682025-04-15
turndown3 (npm)8,8 MiB0,056 sMIT11.3862026-04-03

Referensi resmi: markdownify di PyPI.

install-and-import.json dan metadata-snapshot.json. Masing-masing library diinstal ke environment kosongnya sendiri.

html2text sembilan kali lebih kecil di disk, dan lisensinya GPL-3.0-or-later. Untuk produk yang didistribusikan, anggap ini sebagai titik cek untuk pihak yang menangani lisensi; artikel ini bukan nasihat hukum. markdownify berlisensi MIT, yang umumnya lebih longgar, tetapi tetap harus masuk review kepatuhan biasa.

Ukuran 1,8 MiB juga masih tergolong masuk akal kalau proyek Anda sudah memakai BeautifulSoup, yang memang umum di banyak proyek scraping Python — dalam kasus seperti itu, markdownify hampir gratis.

Laju rilis markdownify juga paling sehat di antara ketiganya: 44 rilis dan ada pembaruan enam minggu sebelum pengujian, sementara html2text terakhir rilis pada April 2025.

Sebenarnya apa yang Anda dapat dari satu baris Python

Seluruh library ini adalah markdownify(html), dan penting untuk menjelaskan dengan jelas apa yang diputuskan oleh pemanggilan itu atas nama Anda, karena tiga dari keputusan itulah yang diuji dalam perbandingan ini.

Ia mem-parse dengan BeautifulSoup, menghapus <script> dan <style> tanpa diminta, dan menghasilkan tabel bergaya GFM dengan pipe luar serta sel kosong yang dipertahankan. Namun, hanya bermodal parser saja tidak otomatis menjamin perilaku terhadap input yang rusak, jadi pertanyaan itu diukur terpisah di bawah.

Tidak satu pun dari semua itu adalah opsi yang perlu Anda set. Itulah perilaku default-nya, dan di kategori yang default-nya turndown masih menyimpan JavaScript dan html2text memaksa hard-wrap di 78 karakter, library yang dari awal sudah benar tanpa perlu dikoreksi memang punya nilai tersendiri.

Opsi tetap tersedia kalau Anda membutuhkannya — heading_style, bullets, code_language, strip dan convert untuk allowlist/denylist elemen, serta MarkdownConverter untuk override per elemen. Semua pengukuran di sini tidak memakai opsi-opsi tersebut.

Memori, dan apa yang dilakukan HTML rusak terhadapnya

Measured results chart: markdownify: memory and malformed input

Konteks stress-test yang lebih luas ada di perbandingan memori dan HTML rusak untuk sepuluh library.

Dua hal yang di daftar semua review dalam batch ini awalnya belum diuji, kini sudah diukur.

Peak resident memory, lewat /usr/bin/time -l, satu proses baru per sel — import floor adalah biaya saat library dimuat dan diam, sedangkan puncaknya mencakup dokumen.

LibraryRuntimeImport floorPuncak 226 KBPuncak 10 MB
html2textpython3.1418,719,971,2
pyquerypython3.1430,333,9172,5
resiliparsepython3.1420,525,1225,1
markdownifypython3.1423,928,9278,5
goose3python3.1444,152,4398,5
cheerionode2266,876,5398,5
justextpython3.1430,336,6431,2
newspaper4kpython3.1452,661,8668,5
trafilaturapython3.1452,564,8927,1
turndownnode2247,868,42947,1

memory-results.json. Baseline Python dan Node tidak bisa dibandingkan langsung; interpreter memang ikut di dalam keduanya.

markdownify ada di tengah: import floor 23,9 MiB dan 278,5 MiB pada dokumen 10 MB. Itu 3,9× puncak html2text dan sekitar sepersepuluh dari turndown, dan itulah trade-off dari BeautifulSoup di bawahnya.

HTML rusak. Dua belas dokumen, masing-masing merusak tepat satu hal — tag yang tidak ditutup, elemen inline yang salah nesting, atribut tanpa tanda kutip berisi spasi, penutup yang nyasar, tidak ada <html> sama sekali, atribut duplikat, dokumen yang terpotong di tengah tag, entity yang salah, <script> yang tidak ditutup, deklarasi charset yang bohong, komentar yang berisi markup, dan nesting 600 lapis — ditambah dua kontrol yang valid secara struktur dengan ukuran yang dicocokkan, karena "ia tidak mengembalikan apa pun" cuma berarti sesuatu tentang kerusakan kalau library itu juga diam pada dokumen bersih dengan ukuran yang sama.

markdownify melempar error pada 1 dari 14 dan mengembalikan kosong pada 0, dengan berhasil memulihkan 30/33 sentinel di seluruh fixture rusak (malformed-results.json). Satu fixture dikecualikan dari hitungan itu: menurut HTML5, semua yang muncul setelah <script> yang tidak tertutup memang dianggap isi script, jadi hilangnya konten di situ adalah perilaku yang benar, dan memulihkannya justru jadi deviasi.

Kelebihan dan kekurangan

Kelebihan. Akurasi tabel setara dengan markitdown, dihitung dengan aturan yang sama. Token paling rendah dari empat. MIT. 1,8 MiB, dan biaya marginalnya nyaris nol kalau BeautifulSoup sudah ada di tree Anda. Cold import tercepat di 0,046 s. Masih aktif dirilis. Mempertahankan sel tabel kosong. Konversi per elemen bisa dioverride lewat MarkdownConverter. Pemanggilan satu baris yang sederhana memang sudah pas.

Kekurangan. Bergantung pada BeautifulSoup, jadi ukurannya sembilan kali html2text kalau Anda belum memilikinya. 2.235 bintang berarti komunitasnya lebih kecil daripada turndown — contoh kasus yang sudah dibahas bakal lebih sedikit saat Anda ketemu hal yang aneh. Hanya untuk Python, jadi tidak membantu di stack Node. Dan ada 42 isu terbuka.

Siapa yang sebaiknya memakai ini, dan siapa yang tidak

Mulailah dengan markdownify untuk workload Python yang mirip fixture ini. Ia menyamai jumlah baris yang keluar dari markitdown menurut penghitung ini, berada di klaster token terendah, dan berlisensi MIT. Kalau Anda sudah bergantung pada BeautifulSoup, jejak instalasi tambahannya mungkin kecil; tetap validasi selisih dependensi sebenarnya di environment Anda.

Pertimbangkan html2text kalau anggaran dependensi Anda dihitung dalam ratusan kilobyte dan bentuk outputnya cocok untuk halaman Anda. Tinjau GPL-3.0-or-later bersama pihak yang memegang lisensi sebelum distribusi.

Pertimbangkan markitdown kalau Anda juga sedang mengonversi PDF atau dokumen Office. Hasil HTML mereka di sini punya jumlah baris yang sama menurut pengukur ini, tetapi fidelitas yang lebih luas tidak dibuktikan setara.

Lewati ini di Node, di mana turndown adalah jawaban yang natural — bersama turndown-plugin-gfm yang dipasang di sampingnya, karena core turndown sendiri tidak menghasilkan tabel sama sekali.

Di mana API terkelola cocok

markdownify mengonversi HTML yang sudah Anda miliki. Ia tidak mengambil halaman, tidak merender JavaScript, dan tidak menangani lapisan anti-bot — keempat konverter ini sama-sama tidak melakukannya, dan di banyak target nyata, itulah separuh pekerjaan yang paling berat.

Untuk fixture yang sama di kelima konverter, lihat perbandingan HTML ke Markdown lima arah.

Stack developer kami di Thunderbit menangani pekerjaan upstream itu: POST /distill mengambil URL dan mengembalikan Markdown, sedangkan POST /extract mengembalikan JSON yang mengikuti skema. Keduanya tersedia lewat server MCP dan CLI; harga ada di halaman harga Thunderbit. Endpoint terkelola itu tidak dibenchmark melawan konverter lokal ini, jadi ini beda kategori, bukan perbandingan performa.

Framing yang jujur: kalau Anda sudah memegang HTML dan ingin Markdown, markdownify gratis dan menjalankan tugasnya sebaik apa pun di sini. Kalau Anda perlu mengambil halaman, atau Anda butuh baris ketimbang prosa, itu pembelian yang berbeda.

Untuk gambaran yang lebih luas, ringkasan web scraping API kami membahas opsi hosted, dan pilar scraper open-source membahas yang self-hosted. Mengonversi HTML ke Markdown di Python adalah panduan praktiknya.

Coba Thunderbit untuk Ekstraksi Data Web

Jadi, apakah markdownify layak dipakai?

Untuk Python, ini kandidat yang kuat kalau input Anda mirip dengan fixture di sini; uji dulu pada tabel dan halaman rusak milik Anda sebelum menjadikannya default.

Ia seimbang dengan markitdown pada jumlah baris tabel yang keluar, berada di klaster token terendah, memulai paling cepat dalam run ini, dan berlisensi MIT. Di sisi lain, ia memakai memori lebih banyak daripada html2text, hanya untuk Python, dan gagal pada satu fixture input rusak. Ukuran disk dan lisensi adalah faktor seleksi tambahan, bukan satu-satunya alasan.

Yang paling menarik bagi saya adalah jumlah bintangnya. turndown punya perhatian lima kali lebih besar, tetapi secara default justru tidak mengonversi tabel yang ditangani markdownify dengan benar. Popularitas di kategori ini tidak sejalan dengan perilaku yang terukur, dan itu sebagian besar alasan mengapa perbandingan ini layak dijalankan.

Coba Thunderbit untuk Ekstraksi Data Web Get Started Free

FAQ

Apakah markdownify benar-benar sebagus markitdown untuk HTML? Pada empat fixture ini, keduanya sama-sama menghasilkan 36 baris tabel Markdown yang dikenali, memulihkan semua 16 string yang diuji, dan menghasilkan output dengan selisih karakter hanya 0,2%. Itu bukan uji kesetaraan per sel atau render. markitdown juga menangani PDF dan format Office, jadi perbandingan ini cuma soal output HTML yang diukur.

Apakah butuh BeautifulSoup? Ya — itu parser-nya, dan sebagian besar dari 1,8 MiB tadi. Kalau proyek Anda sudah memakai BeautifulSoup, biaya tambahan markdownify kecil. Kalau belum, dan ukuran disk memang penting, html2text cuma 0,2 MiB dengan satu paket, dengan konsekuensi lisensi GPL-3.0-or-later.

Bagaimana cara menangani sel tabel kosong? Ia tetap menampilkannya. Pada fixture yang punya celah data, output mempertahankan sel kosong di posisi yang benar, jadi semua nilai berikutnya tetap berada di kolom yang semestinya. Konverter yang melewati sel kosong menghasilkan tabel yang masih tampak valid tetapi semua nilainya bergeser satu kolom ke kiri — kegagalan yang lebih buruk karena tidak ada tanda yang menunjukkan masalahnya.

Harus pakai fungsi atau class? Pakai fungsi markdownify() untuk kasus umum. Gunakan MarkdownConverter saat Anda perlu mengubah cara elemen tertentu dikonversi — semua pengukuran di sini memakai fungsi polos dengan opsi default.

Apa yang tidak diuji di sini? Empat fixture bersama plus satu diagnostic khusus tabel bukan korpus yang representatif. Suite HTML rusak terpisah mencakup 12 jenis kerusakan yang dinamai dan dua kontrol, tetapi tidak semua bentuk HTML rusak. Daftar bersarang, definition list, footnote, math, round trip Markdown ke HTML, kesetaraan tabel per sel, dan variasi konfigurasi tidak dibandingkan. Kecepatan konversi juga tidak dibandingkan.

Ke
Ke
CTO di Thunderbit | Senior Data Scientist & Expert ML Dengan pengalaman hampir satu dekade di bidang machine learning dan data science, Ke Shen adalah lulusan Columbia University dan mantan Senior Data Scientist di Walmart Labs. Dengan keahlian mendalam yang diakui sejawat dalam Python, R, Java, dan Statistik, ia membagikan wawasan teruji lapangan tentang bagaimana membawa algoritma AI yang kompleks dari teori ke arsitektur siap produksi.
Daftar isi
Thunderbit · Agen data web AI

Ekstrak data dari halaman apa pun dalam 1 klik

Dipercaya 250.000+ pengguna
tersedia paket gratis
Dari halaman web ke spreadsheet
Jelaskan kebutuhanmu — Agen AI Thunderbit akan men-scrape lalu mengekspor ke Excel, Google Sheets, Airtable, atau Notion. Gratis untuk memulai.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week