Phần lớn các công cụ scraping đang được chú ý trong năm nay đều muốn điều khiển một trình duyệt. trafilatura thì không. Đây là một thư viện thuần Python, đọc HTML tĩnh, tự xác định đâu mới là phần nội dung bài viết thật sự, rồi bỏ hết phần còn lại. Nhiệm vụ hẹp đó — trích xuất nội dung chính — chính là toàn bộ mục tiêu của công cụ này, và nó đã làm việc đó từ قبل khi cụm từ "LLM-ready markdown" còn chưa được nhắc đến rộng rãi.
Tôi đã chạy phiên bản 2.1.0 qua một bộ fixture cố định trên Python 3.14, và bài test về bài viết là phần gây ấn tượng nhất. Tôi bọc một đoạn văn bản thật vào lớp vỏ quen thuộc của trang web — một lời nhắc đăng nhập, một nút giục "Subscribe", các liên kết điều hướng, và chân trang bản quyền — rồi trafilatura trả lại tiêu đề, cả 3 đoạn nội dung, tác giả và ngày tháng, đồng thời loại sạch mọi dấu vết boilerplate đó. Không cần trình duyệt, không cần luật riêng cho từng website, chỉ một lần gọi hàm. Điểm cần lưu ý, và đúng là có một điểm như vậy, sẽ xuất hiện ngay khi bạn hỏi nó về bất kỳ dữ liệu có cấu trúc nào. Tôi sẽ nói rõ hơn ở phần dưới (đó là giới hạn thiết kế, không phải lỗi).
trafilatura là gì, và giả định nào nên bỏ đi
Giới thiệu chính thức của công cụ mô tả nó là một "Python & command-line tool to gather text and metadata on the Web: crawling, scraping, extraction", với đầu ra ở nhiều định dạng như CSV, JSON, HTML, Markdown, TXT hoặc XML. Mô tả đó khá rộng, và nó chưa nói bật lên điểm khác biệt thực sự của công cụ. Giá trị của trafilatura không nằm ở các helper cho crawling hay ở sáu định dạng đầu ra. Nó nằm ở trích xuất nội dung: đầu vào là một tài liệu HTML, đầu ra là phần văn bản bài viết chính, còn các thành phần giao diện trang thì bị gỡ bỏ.
Hãy hình dung theo cách này, vì nó giúp hiểu cả sức mạnh lẫn giới hạn của công cụ chỉ trong một bước. Phần lớn scraper mà bạn trỏ vào một trang web đều dựa trên selector. Bạn bảo chúng "lấy phần tử có class product-price", và chúng trả về đúng nội dung ở địa chỉ đó. trafilatura đi theo hướng ngược lại. Nó đọc toàn bộ tài liệu rồi tự quyết định khối nào là bài viết, khối nào chỉ là boilerplate, dựa trên các heuristic thay vì selector do bạn viết tay. Đó là lý do nó không cần cấu hình riêng cho từng site để làm sạch một trang chưa từng thấy. Và cũng chính vì thế nó không thể trả về một catalog có cấu trúc: không có schema, không có map trường dữ liệu, chỉ có một phán đoán về đâu là nội dung. Nó là một extractor, không phải parser để bạn chỉ đích.
Nó cũng rất nhẹ đúng nghĩa. Thuần Python, không headless browser, không một binary Chromium nằm chờ trong cache, không cài Playwright rồi bất ngờ "chụp" bạn ngay lần chạy đầu. Đặc tính này nghe có vẻ nhỏ cho đến khi bạn phải chạy extraction trên hàng nghìn URL, và mỗi MB dependency, mỗi subprocess đều trở thành thứ bạn phải vận hành. Tính đến 2026-07-09, đây là một dự án khoảng 6,26k sao (adbar/trafilatura) — nhỏ hơn nhiều so với các framework browser và crawler mà nó hay bị xếp chung vào, và đó là thông tin về phạm vi, không phải lời chê về chất lượng.
Phần cài đặt ngắn đến mức đó chính là lời khen
Việc cài đặt chỉ một dòng, và không có gì đáng cảnh báo — bản thân điều đó đã đáng để ghi nhận. Chạy pip install trafilatura trong một virtualenv mới trên Python 3.14 kéo về một cây package gọn gàng, sạch sẽ: không phải tải browser, không có bước hậu cài đặt, không có bức tường dependency dày cộp. Tôi đã xem đủ loại thư viện kiểu này để ngồi chờ cái “cú đá thứ hai”: gói browser 150MB chỉ lòi ra khi chạy lần đầu, native extension không biên dịch được, hay một nhóm [fetchers] phụ nào đó chẳng ai nhắc tới. Với trafilatura, cú đá đó không hề xuất hiện.
Phiên bản pip trả về cho tôi (2.1.0) khớp với bản phát hành hiện tại, công bố ngày 2026-06-07, nên các con số dưới đây không mang dấu sao kiểu “bạn đã test một bản cũ”. Điều đó không phải lúc nào cũng đúng trong phân khúc này — khá nhiều công cụ nặng hơn tôi từng xem đã tụt một major version vào lúc tôi chạy chúng. Ở đây, bản đã test và bản đang phát hành là một.
Thử tay: extractor thực sự trả về gì
Tôi chạy trafilatura trên các fixture được dựng để chạm vào cả thế mạnh lẫn điểm dừng của nó. Bài test về bài viết là thứ quyết định cách tôi đánh giá công cụ này.

Tôi lấy một fixture bài viết cục bộ rồi nhét phần nội dung thật vào giữa đống nhiễu — lời nhắc đăng nhập, lời kêu gọi "Subscribe", các liên kết điều hướng, và chân trang bản quyền, đúng kiểu boilerplate mà một scraper ngây thơ sẽ kéo cả vào cùng phần thân bài. trafilatura trả về tiêu đề cùng đủ cả 3/3 đoạn nội dung, và mọi dấu hiệu boilerplate riêng biệt — Login, Subscribe, Copyright — đều không xuất hiện trong kết quả. Ngoài phần text, nó còn lấy đúng tác giả và ngày tháng từ metadata của trang. Kết quả được xuất ra .txt, .md, và .json chỉ từ một lần gọi.

Chi tiết đa định dạng này đáng dừng lại một nhịp. Một lần extraction cho ra bản text thường, Markdown và JSON. Đường Markdown chính là bước "LLM-ready text" mà mọi người đang săn hiện nay: đưa vào một trang lộn xộn, nhận lại văn xuôi sạch sẽ nhưng vẫn giữ cấu trúc, rồi chuyển cho model. trafilatura làm điều đó mà không cần trình duyệt ở bất kỳ khâu nào, đó là một con đường lặng lẽ hơn nhưng cho ra cùng kiểu đầu ra mà các công cụ điều khiển browser phải dựng cả một stack render để tạo nên.
Rồi đến kiểm tra với trang công khai. Tôi trỏ nó vào một trang sản phẩm live — một trang sản phẩm từ Books to Scrape — và nó trả về 1.324 ký tự text sạch kèm Markdown: khối mô tả, dễ đọc, không lẫn các phần giao diện trang. Và khi tôi đưa vào một trang phản hồi HTTP 500, fetch_url trả về None thay vì ném lỗi. Không sập, không stack trace để xử lý. Kiểu thất bại “chán nhưng đúng” này chính là thứ bạn muốn ở một công cụ chạy không giám sát theo lịch.
Những điểm cần lưu ý
Có ba điểm, và mỗi điểm đều thu hẹp nơi công cụ này phù hợp.

Đầu tiên, và quan trọng nhất: trafilatura là một content extractor, không phải structured scraper. Tôi chạy nó trên một fixture catalog 12 sản phẩm. Nó trả về đủ 12 tên sản phẩm — dưới dạng text — nhưng chính xác 0 dòng dữ liệu có cấu trúc (478 ký tự text phẳng). Tên và giá có nằm trong output; chỉ là chúng không được tách thành các trường. Nếu bạn cần [{name, price, rating}, …], đây là công cụ sai, và không có cờ cấu hình nào thay đổi được điều đó. Đó là lựa chọn thiết kế về mục đích sử dụng, không phải lỗi để báo.

Thứ hai: nó không render JavaScript. Nó chỉ tiêu thụ HTML tĩnh. Nếu bạn trỏ nó vào một single-page app render phía client, bạn sẽ chỉ nhận được thứ mà server đã trả về trước khi JS chạy — thường là chẳng có gì hữu ích. Nếu nguồn của bạn nặng JS, hãy ghép nó với một renderer riêng; trafilatura không làm phần đó, và nó cũng không hứa sẽ làm.
Thứ ba là một lưu ý về chính bằng chứng của tôi. Bài test công khai ở trên dựa vào một khối mô tả sản phẩm, chứ không phải một bài báo thực sự, vì sandbox công khai tôi dùng (họ toscrape) chỉ có catalog, không có trang tin tức. Kết quả làm sạch bài viết từ fixture cục bộ là có kiểm soát. Tôi tin kết quả đó — việc loại boilerplate là rõ ràng và có thể lặp lại — nhưng một trang sản phẩm không phải bằng chứng cho trích xuất cấp newsroom, nên tôi sẽ không xem nó là như vậy.
Để lấp bớt khoảng cách này, tôi làm thêm một demo riêng, không chấm điểm, trên hai trang bài viết thật, đọc từ fixture đã lưu để lần chạy có thể tái lập. Ở bài Wikipedia "Web scraping", trafilatura đưa phần thân từ 230.049 byte HTML thô xuống còn 26.673 byte nội dung trích xuất (tỷ lệ thân/thô 0,116), và cả bốn marker giao diện được kiểm tra — "Jump to content," "Privacy policy," "Powered by MediaWiki," "This page was last edited" — đều biến mất. Ở một bài Wikinews được lưu trữ, nó đi từ 79.716 byte xuống 2.200 byte (tỷ lệ 0,028), với cả năm marker kiểm tra đều bị loại bỏ. Tiêu đề, ngày tháng và hostname đều được điền trên cả hai trang; author và sitename đều trả về null ở cả hai, và tôi đang báo đúng những phần thiếu đó thay vì che đi. Cần phân biệt rõ hai điều ở đây: tỷ lệ byte đó đo mức độ markup và giao diện bị cắt bỏ, không phải độ chính xác trích xuất; và cả hai trang đều thuộc họ MediaWiki, nên đây là một minh họa trên bài viết thật, không phải một corpus đại diện.
Về độ chính xác cụ thể, tôi sẽ dẫn nguồn bên ngoài thay vì giả vờ mình tự benchmark. trafilatura có trang evaluation, và nó ghi nhận F1 cao nhất trong nhóm open-source (khoảng 0,945) trong ScrapingHub article-extraction benchmark so với các công cụ như readability-lxml (~0,887). Có hai lưu ý честно về con số đó: nó đến từ benchmark kia, không phải từ thử nghiệm của tôi, và giá trị ~0,945 được gắn với nhánh 0.5.1 cũ hơn trong nguồn, chứ không phải 2.1.0 mà tôi chạy. Hãy xem nó như bằng chứng benchmark bên ngoài cho lý do công cụ này có tiếng về extraction, chứ không phải là số đo từ bài đánh giá này.
Ưu và nhược điểm
Ưu điểm:
- Trích xuất bài viết sạch nhất trong bộ test của tôi — tiêu đề cộng đủ 3/3 đoạn, mọi dấu boilerplate (Login/Subscribe/Copyright) đều bị loại.
- Lấy đúng metadata author và date cùng với phần thân bài.
- Xuất đa định dạng chỉ từ một lần gọi: txt, Markdown và JSON — trong đó Markdown thực sự là một bước text sẵn sàng cho LLM.
- Cài đặt nhẹ, thuần Python — không browser, không tải binary, không bức tường dependency.
- Thất bại êm:
fetch_urltrảNonekhi gặp HTTP 500 thay vì ném lỗi. - Phiên bản đã test trùng với bản phát hành hiện tại (2.1.0) — không có độ lệch phiên bản.
- Giấy phép Apache-2.0 — thoáng và phù hợp cho mục đích thương mại.
Nhược điểm:
- Không phải structured scraper: fixture catalog trả về 12 tên dưới dạng text và 0 dòng có kiểu dữ liệu. Không có schema, không có field.
- Không render JavaScript — chỉ HTML tĩnh; cần renderer riêng nếu trang của bạn render phía client.
- Metadata chỉ đầy đủ một phần ở một số site: author và sitename đều trả về null trên cả hai fixture bài viết thật.
- Bài test prose công khai của tôi dùng khối mô tả sản phẩm, không phải bài báo thật.
- Trình spider crawl/sitemap và các định dạng đầu ra CSV/XML tích hợp chưa được thử trong lần này, nên tôi không đưa ra nhận định về chúng.
Dành cho ai — và ai nên bỏ qua
trafilatura sinh ra cho người có bài toán kiểu: "Tôi có các URL và tôi muốn phần text bài viết thật sạch, không có thanh điều hướng, banner cookie hay lời nhắc newsletter." Xây corpus text, đưa trang vào model, lưu trữ nội dung dễ đọc, chạy NLP trên bài web — đó là sân của nó, và công cụ này làm rất tốt. Nếu bạn muốn một bước nhẹ, không cần browser, biến HTML lộn xộn thành Markdown hoặc JSON sạch, hãy cài nó và tiếp tục công việc.
Hãy bỏ qua nó nếu thứ bạn thật sự cần là trích xuất có cấu trúc: các dòng sản phẩm có giá, bản ghi có kiểu dữ liệu, các trường key: value. Nó đưa cho bạn text, không phải bảng — bài test catalog lấy được tên nhưng không lấy được rows, và điều đó sẽ không thay đổi. Cũng nên bỏ qua nếu mục tiêu của bạn render nội dung bằng trình duyệt mà bạn không muốn ghép thêm renderer riêng, vì trafilatura chỉ đọc HTML tĩnh rồi dừng ở đó. Cách thất bại không quá kịch tính; bạn chỉ nhận kết quả rỗng hoặc mỏng, rồi tự hỏi vì sao. Hãy chọn đúng công cụ cho đúng việc — bài viết dạng text thì được; JSON có cấu trúc hoặc trang cần JS render thì nên tìm lựa chọn khác.
Các lựa chọn thay thế, và vị trí của Thunderbit
Dùng thử Thunderbit để trích xuất dữ liệu web
Nói công bằng trước. trafilatura là một thư viện tự host, miễn phí, giấy phép Apache-2.0, bạn tự chạy. Bạn sở hữu mã nguồn, không tốn phí theo từng trang, và nó đủ nhẹ để nhúng vào bất kỳ pipeline nào mà không gây gánh nặng vận hành. Với nhiệm vụ cụ thể là bóc tách bài viết thành text sạch, tổ hợp đó rất khó vượt qua, và một dịch vụ trả phí cũng không làm thay đổi kết luận này.
So sánh chỉ thực sự đáng nói ở ranh giới mà trafilatura cố ý vẽ ra: dữ liệu có cấu trúc và JavaScript. Đó là hai thứ nó không làm, và cũng chính là hai thứ một API trích xuất được quản lý được sinh ra để xử lý. Đó là vị trí của stack developer của Thunderbit — nằm ở phía bên kia của đường ranh đó, bổ trợ cho trafilatura chứ không cạnh tranh với nó ở bài toán text bài viết HTML tĩnh. Endpoint /distill làm cùng kiểu việc mà trafilatura làm, từ trang web sang Markdown sạch sẵn cho LLM, nhưng phía server đã xử lý rendering JavaScript, tức là đúng phần mà trafilatura bỏ qua. Còn /extract trả về JSON có cấu trúc dựa trên schema bạn định nghĩa, tức là đúng phần mà trafilatura từ chối theo thiết kế: catalog trả về 478 ký tự text phẳng là ví dụ điển hình cho lúc bạn nên dùng /extract. Với AI agent và coding assistant còn có một MCP server, trong đó công cụ gợi ý trường có thể thử miễn phí, và CLI qua npx @thunderbit/thunderbit-cli cho terminal, CI và cron. Nó chạy trên cùng engine với Thunderbit Chrome Extension, vốn được hơn 100.000 người dùng, nên lối đi không kỹ thuật cũng có sẵn; nhưng với đối tượng này, API, MCP và CLI mới là các bề mặt đáng quan tâm.
Vậy nên, đánh đổi thật sự chưa bao giờ nằm ở chất lượng trích xuất text — trafilatura thắng ở đúng những trang nó được thiết kế cho, và tôi nói điều đó rất thẳng. Đánh đổi nằm ở phạm vi và ai là người chạy browser. Cần text bài viết sạch từ HTML tĩnh, tự host, không tốn chi phí theo mỗi lần gọi? trafilatura là công cụ nhẹ hơn, sắc hơn, vậy thôi. Cần JSON có cấu trúc theo schema, hoặc trang chỉ render sau khi JavaScript chạy? Đó là sân của stack được quản lý, và trafilatura không hề cố tham gia cuộc chơi đó. Nếu bạn đang cân nhắc chi phí theo trang so với việc tự vận hành renderer, hãy xem trang giá Thunderbit.
Nếu bạn muốn so sánh trên toàn bộ danh mục, tôi có một bản đối chiếu đang cập nhật về các công cụ web scraping tôi thực sự dùng, đặt các thư viện như công cụ này cạnh các lựa chọn chạy bằng browser và dịch vụ được quản lý.
Kết luận
Có nên dùng trafilatura không? Có — nếu công việc của bạn là biến HTML lộn xộn thành text bài viết sạch, và bạn hiểu rõ hai thứ mà nó cố ý không làm. Nó đã loại sạch toàn bộ boilerplate trên một trang và trả lại tiêu đề, cả 3 đoạn thân bài, cùng tác giả và ngày tháng, từ một lần cài đặt nhẹ, không cần browser. Nó xuất cùng lúc txt, Markdown và JSON, nên hoàn toàn là một bước text sẵn sàng cho LLM. Trong một lĩnh vực vốn tin rằng bạn cần headless browser và AI crawler để làm bất cứ thứ gì, công cụ không mở trình duyệt này lại là thứ dọn dẹp đúng điều tôi quan tâm.
Chỉ cần đặt kỳ vọng đúng. Nó là extractor, không phải structured scraper — catalog trả về 12 tên dạng text và 0 rows. Nó đọc HTML tĩnh và không chạy JavaScript. Việc trích xuất metadata của nó rất tốt ở một số trang nhưng chỉ một phần ở trang khác (author và sitename đều null trên cả hai fixture bài viết thật mà tôi kiểm tra). Và bài test prose công khai của tôi dựa vào một khối mô tả sản phẩm, không phải bài báo thật, nên hãy xem tuyên bố cấp newsroom như một tín hiệu hứa hẹn chứ chưa phải kết luận cuối cùng. Trong những giới hạn đó, trafilatura làm đúng một việc của mình sạch hơn các công cụ nặng hơn mà tôi đã so sánh — và nó làm điều đó với gần như chẳng cần cài thêm gì.
Dùng thử Thunderbit để trích xuất dữ liệu web Get Started Free
Câu hỏi thường gặp
trafilatura thực sự trích xuất gì từ một trang? Nội dung chính — phần thân bài cùng tiêu đề, và các metadata như tác giả, ngày tháng — sau khi loại bỏ boilerplate. Trong bài test của tôi, nó trả về tiêu đề và đủ 3/3 đoạn thân bài từ một trang bị bao quanh bởi navigation, login, subscribe và copyright noise, và mọi marker đó đều không xuất hiện trong output. Nó xác định cái gì là nội dung bằng heuristic nên không cần selector riêng cho từng site để làm sạch một trang chưa từng thấy.
trafilatura có thể scrape catalog sản phẩm thành các dòng có cấu trúc không? Không. Nó là content extractor, không phải structured scraper. Trên fixture catalog 12 sản phẩm, nó trả về đủ 12 tên sản phẩm dưới dạng text phẳng (478 ký tự) và 0 dòng có cấu trúc — tên có trong output nhưng không phải field. Nếu bạn cần bản ghi có kiểu dữ liệu như tên/giá/đánh giá, hãy dùng parser dựa trên selector hoặc một API trích xuất dựa trên schema.
trafilatura có render JavaScript không? Không. Nó chỉ tiêu thụ HTML tĩnh. Nếu bạn trỏ nó vào một trang render phía client, bạn sẽ chỉ nhận được phần server đã trả trước khi JavaScript chạy, và thường đó không phải nội dung bạn cần. Hãy ghép thêm một renderer riêng nếu nguồn của bạn nặng JS; trafilatura chỉ đọc tài liệu tĩnh rồi dừng lại ở đó.
Cài trafilatura có khó không?
Không — đây là một trong những điểm mạnh thực sự của nó. pip install trafilatura kéo về một cây package gọn trong virtualenv mới trên Python 3.14, không tải browser, không bước hậu cài đặt, và không có nhóm extra ẩn. Phiên bản pip cài đặt (2.1.0) trùng với bản phát hành hiện tại, công bố ngày 2026-06-07.
trafilatura chính xác đến mức nào so với các extractor khác? Trong bài review này tôi không benchmark độ chính xác, nên tôi sẽ dẫn nguồn bên ngoài. trafilatura có trang evaluation, và nó công bố F1 open-source cao nhất (khoảng 0,945) trong ScrapingHub article-extraction benchmark so với các công cụ như readability-lxml (~0,887). Lưu ý rằng con số này đến từ benchmark đó trên nhánh 0.5.1 cũ hơn, không phải 2.1.0 tôi đã test — vì vậy hãy đọc nó như bằng chứng bên ngoài cho uy tín của công cụ, chứ không phải là phép đo từ bài viết này.


