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.

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.
| Konverter | Probe isi | Karakter output | Token (o200k) | Baris tabel Markdown | Link |
|---|---|---|---|---|---|
| markdownify | 16/16 | 76.868 | 21.062 | 36 | 599 |
| html2text | 16/16 | 76.452 | 21.176 | 32 | 545 |
| markitdown | 16/16 | 76.995 | 21.336 | 36 | 598 |
| turndown | 16/16 | 95.188 | 26.236 | 0 | 611 |
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.55 — ia 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.

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:
| Fixture | markdownify | html2text |
|---|---|---|
| Statistik hoki | 27 baris | 27 baris |
| Wikipedia | 9 baris | 5 baris |
| Nothing but tables (diagnostic terpisah) | 62 baris | 59 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
| Library | Paket | Ukuran disk | Cold import | Lisensi | Bintang | Rilis terakhir |
|---|---|---|---|---|---|---|
| markdownify | 5 | 1,8 MiB | 0,046 s | MIT | 2.235 | 2026-06-30 |
| html2text | 1 | 0,2 MiB | 0,077 s | GPL-3.0-or-later | 2.168 | 2025-04-15 |
| turndown | 3 (npm) | 8,8 MiB | 0,056 s | MIT | 11.386 | 2026-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

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.
| Library | Runtime | Import floor | Puncak 226 KB | Puncak 10 MB |
|---|---|---|---|---|
| html2text | python3.14 | 18,7 | 19,9 | 71,2 |
| pyquery | python3.14 | 30,3 | 33,9 | 172,5 |
| resiliparse | python3.14 | 20,5 | 25,1 | 225,1 |
| markdownify | python3.14 | 23,9 | 28,9 | 278,5 |
| goose3 | python3.14 | 44,1 | 52,4 | 398,5 |
| cheerio | node22 | 66,8 | 76,5 | 398,5 |
| justext | python3.14 | 30,3 | 36,6 | 431,2 |
| newspaper4k | python3.14 | 52,6 | 61,8 | 668,5 |
| trafilatura | python3.14 | 52,5 | 64,8 | 927,1 |
| turndown | node22 | 47,8 | 68,4 | 2947,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.


