Cheerio: bộ phân tích HTML kiểu jQuery cho Node
Cheerio là thư viện bạn cần khi muốn scrape hoặc xử lý HTML mà không phải bật cả một trình duyệt. Nó cài đặt một tập con API của jQuery ngay trên nền parse5, nên ai từng viết $('.foo').text() là dùng được ngay. Không chạy JavaScript, không render CSS, không có layout — chỉ có markup vào và markup ra. Với scraping HTML tĩnh thì khó có gì hơn được nó; còn trang nặng JavaScript thì vẫn cần Puppeteer hoặc Playwright.
Cheerio là gì?
Cheerio là thư viện Node.js phân tích HTML và XML thành một API kiểu jQuery để bạn truy vấn và chỉnh sửa ngay trên server. Nó nạp một chuỗi document bằng cheerio.load(), sau đó cho phép chọn phần tử bằng CSS selector qua parse5 (hoặc htmlparser2 dễ tính hơn) rồi đọc hoặc đổi nội dung, thuộc tính, class. Không có DOM thật, không trình duyệt, không chạy JavaScript. Theo README, Cheerio chạy được cả trên server lẫn trình duyệt.
Key features: jQuery syntax, fast parsing, flexible input
- ✓Cài đặt một tập con API cốt lõi của jQuery, nên $('h2.title').text() hay $('h2').addClass('welcome') hoạt động đúng như trong script trình duyệt.
- ✓Mặc định phân tích bằng parse5, có thể chuyển sang htmlparser2 khi cần xử lý HTML không theo chuẩn — tức HTML scrape thực tế, không chỉ markup sạch.
- ✓Chạy được cả trên server lẫn trình duyệt, theo README.
- ✓Render lại thành HTML bằng .html(), thành outerHTML qua .prop('outerHTML'), hoặc thành text thuần bằng .text().
- ✓Không có overhead của một DOM tree đầy đủ — README mô tả mô hình này là đơn giản và nhất quán, đó là lý do phân tích và thao tác luôn nhanh.
- ✓Selector có thể giới hạn phạm vi qua $(selector, context, root), cho phép tìm trong một nhánh con thay vì cả document.
Use case phổ biến: scraping, trích xuất dữ liệu, testing
- •Web scraping — lấy dữ liệu có cấu trúc từ các trang HTML bạn không kiểm soát.
- •Pipeline trích xuất dữ liệu cần lấy field cụ thể từ nhiều trang cùng lúc.
- •Test HTML render phía server mà không cần bật trình duyệt.
- •Xử lý template hoặc hậu xử lý HTML phía server trước khi gửi cho client.
Cài đặt Cheerio
Cài bằng một package manager: npm install cheerio, hoặc bun add cheerio, hoặc deno install cheerio. Theo README, Cheerio phát hành dưới dạng ES module (import * as cheerio from 'cheerio') và cũng dùng được với require() trong môi trường CommonJS.
Phân tích HTML và chọn phần tử
Nạp một chuỗi document bằng const $ = cheerio.load(html), rồi dùng selector kiểu jQuery — $('.apple', '#fruits').text() tìm bên trong phạm vi #fruits. Đọc thuộc tính bằng .attr('class'), lấy markup bên trong bằng .html(), hoặc render lại cả document bằng $.html(). Vậy là xong cả quy trình. Node DOM của Cheerio cũng có các thuộc tính quen thuộc: tagName, parentNode, childNodes, previousSibling, nextSibling, và nhiều hơn nữa, nên code vốn quen duyệt DOM kiểu trình duyệt gần như chạy ngay.
Điểm mạnh
- ✓Cú pháp jQuery gần như không có đường cong học — ai từng dùng jQuery là bắt tay vào việc ngay.
- ✓Bọc quanh parse5 kèm tùy chọn dùng htmlparser2 nghĩa là xử lý được HTML lộn xộn ngoài đời thực, không chỉ document sạch.
- ✓License MIT, nên không có gì mập mờ khi dùng trong scraping hay pipeline dữ liệu thương mại.
- ✓Hoạt động như nhau dù chạy trên Node hay trong bundle trình duyệt, theo README.
Những gì Cheerio không làm được
- △Không chạy JavaScript — nếu dữ liệu bạn cần được một script phía client tạo ra, Cheerio sẽ không thấy nó; lúc đó phải dùng Puppeteer hoặc Playwright.
- △Không render CSS hay layout, nên bất cứ thứ gì phụ thuộc vào computed style, visibility, hay kích thước viewport đều nằm ngoài khả năng.
- △Đây không phải một DOM implementation đầy đủ — chỉ phần API mà README công bố (tập con của jQuery) mới chắc chắn hoạt động giống jQuery.
- △Danh sách người dùng 'Cheerio in the real world' của README nằm ở wiki chứ không phải trong repo, nên muốn xác minh ai đang dùng nó trong production phải bấm thêm một bước.
Lựa chọn thay thế: jsdom, Puppeteer và các parser khác
Câu hỏi thường gặp
Cheerio miễn phí và mã nguồn mở, phát hành theo license MIT. Nghĩa là bạn dùng được trong dự án thương mại hay closed-source mà không phải trả phí hay mở mã nguồn của mình, miễn giữ nguyên license notice.
Theo README, Cheerio chạy được cả trên server lẫn trình duyệt, không chỉ giới hạn ở Node.js. Nó không phụ thuộc vào một DOM hay window object thật, nên cùng một đoạn code phân tích và selector chạy được ở bất cứ đâu bạn nạp nó.
Cheerio cài đặt một tập con API của chính jQuery — cùng cú pháp selector và các method như .text(), .attr(), .addClass() — nhưng thao tác trên một chuỗi document bạn tự nạp bằng cheerio.load(), không phải trên DOM trình duyệt thật. Không có event handling hay AJAX, chỉ có phân tích và thao tác markup.
Cheerio mặc định bọc quanh parse5 để phân tích HTML, và có thể tùy chọn dùng htmlparser2, một parser dễ tính hơn. Theo README, cả hai đều là thư viện riêng mà Cheerio xây API kiểu jQuery lên trên.
Theo README, Cheerio phân tích được gần như mọi document HTML hoặc XML, đặc biệt khi cấu hình dùng parser htmlparser2 dễ tính thay vì parse5 mặc định. Sự linh hoạt đó nhắm thẳng vào markup lộn xộn ngoài đời thực, không chỉ document sạch theo chuẩn.
README mô tả Cheerio là cực nhanh vì nó dùng một mô hình DOM đơn giản, nhất quán thay vì một implementation đầy đủ như trình duyệt. README không đưa ra con số benchmark so với jsdom, nhưng đánh đổi thiết kế đó — mô hình nhẹ hơn thay vì độ chính xác DOM/CSSOM đầy đủ — chính là cơ sở cho tuyên bố về tốc độ.
Vấn đề mà Cheerio giải quyết
Script Node cần đọc dữ liệu từ HTML không có sẵn DOM, còn kéo cả một trình duyệt thật (Puppeteer, một instance headless Chrome) chỉ để chạy querySelectorAll là quá tốn kém cho những trang vốn chẳng cần JavaScript. Cheerio lấp đúng khoảng trống đó — truy vấn kiểu jQuery mà không cần trình duyệt bên dưới, cho phần lớn HTML vốn đã hoàn chỉnh khi tới tay bạn.
Ai nên dùng — và ai nên bỏ qua
Chọn Cheerio nếu bạn đang lấy dữ liệu từ HTML tĩnh hoặc render phía server trong dự án Node và đã quen tư duy selector kiểu jQuery — chỉ vài phút là truy vấn được document. Bỏ qua nó nếu trang bạn nhắm tới render nội dung bằng JavaScript phía client; Cheerio không có engine chạy JavaScript, nên bạn sẽ chỉ parse được một khung rỗng.
Repo liên quan
Vẫn đang phân vân về cheerio?
Một cú bấm sẽ gửi câu hỏi kèm trang này cho AI — xem AI nói gì về cheerio.
