Debugging & Troubleshooting

BeautifulSoup: Vì sao prettify() làm thay đổi HTML mô tả?

soup.prettify() thêm xuống dòng và thụt lề, có thể làm thay đổi cách HTML mô tả hiển thị và được lưu. Hãy dùng soup.decode() hoặc str(soup).

Ảnh đại diện Long Nguyen

Long Nguyen

Lập trình viên Fullstack · Kỹ sư AI · Nhà nghiên cứu

• • 3 phút đọc •

Khi xử lý mô tả sản phẩm HTML bằng BeautifulSoup rồi ghi kết quả trở lại, phương thức dùng để tuần tự hóa soup rất quan trọng. soup.prettify() và soup.decode() đều chuyển cây phân tích cú pháp thành chuỗi, nhưng chúng không thể thay thế cho nhau: prettify() có thể âm thầm làm thay đổi cách mô tả hiển thị và dữ liệu được lưu, trong khi decode() tạo ra bản sao trung thực.

Sự khác biệt

soup.decode() là bộ tuần tự hóa dạng gọn — thực chất chính là phương thức mà str(soup) gọi bên dưới. Nó trả về HTML như hiện có, không thêm khoảng trắng mang tính trình bày. soup.prettify() sử dụng cùng cơ chế tuần tự hóa nhưng bật chế độ định dạng đẹp: mỗi thẻ được đặt trên một dòng riêng và thêm thụt lề để con người dễ đọc mã đánh dấu hơn. Khả năng dễ đọc này đến từ việc chèn các ký tự xuống dòng (\n) và dấu cách vào kết quả, dù chúng không hề có trong bản gốc.

Vì sao prettify() làm thay đổi mô tả

Những ký tự được chèn này không phải lúc nào cũng chỉ mang tính trình bày khi HTML được hiển thị. Khi prettify() tách một phần tử inline thành dòng riêng, ký tự xuống dòng và phần thụt lề giữa phần tử đó với văn bản xung quanh sẽ được trình duyệt thu gọn thành một dấu cách. Khoảng trắng này vốn không có trong bản gốc.

Bản gốc:

<p>Size: <b>Large</b>. Ships free.</p>

Sau khi dùng prettify():

<p>
 Size:
 <b>
  Large
 </b>
 .
 Ships free.
</p>

Bản gốc hiển thị là "Size: Large. Ships free.". Bản đã định dạng đẹp hiển thị là "Size: Large . Ships free." — một dấu cách thừa xuất hiện trước dấu chấm vì ký tự xuống dòng giữa </b> và . đã trở thành khoảng trắng. Nếu mô tả có nhiều thẻ inline (<a>, <span>, <em>, <strong>), văn bản hiển thị sẽ ngày càng lệch khỏi bản gốc.

Tình trạng còn nghiêm trọng hơn nếu mô tả đã lưu được hiển thị trong ngữ cảnh giữ nguyên khoảng trắng — bên trong <pre>, <textarea>, một phần tử có white-space: pre, hoặc khi hệ thống downstream xử lý nó dưới dạng văn bản thuần túy. Khi đó, mọi ký tự xuống dòng và dấu cách thụt lề do prettify thêm vào đều xuất hiện nguyên dạng.

Nên dùng phương thức nào

  1. Để đọc, chỉnh sửa và ghi lại mô tả HTML, hãy dùng str(soup) hoặc soup.decode(). Các phương thức này giữ nguyên cấu trúc HTML qua quá trình chuyển đổi mà không thêm khoảng trắng.
  2. Chỉ dùng soup.prettify() để con người kiểm tra — chẳng hạn khi ghi log, gỡ lỗi hoặc xem nhanh cấu trúc — không dùng cho giá trị cần lưu hoặc gửi lại.
  3. Nếu bạn đã lưu các mô tả được định dạng bằng prettify, đừng mặc định rằng chúng vẫn sạch: chúng có thể chứa những thay đổi về khoảng cách tại ranh giới giữa các phần tử inline mà việc phân tích lại sẽ không tự động loại bỏ.

Quy tắc đơn giản là: prettify() dành cho bạn đọc, còn decode() dành cho dữ liệu.

Việc chuẩn hóa sạch HTML mô tả trên nhiều sàn thương mại điện tử là một khâu tưởng như đơn giản nhưng lại rất dễ phát sinh các lỗi hiển thị tinh vi như trên. Sau khi xây dựng các hệ thống tích hợp đa kênh trên hơn 20 kênh bán hàng, tôi thường xuyên xử lý việc làm sạch mô tả và chuyển đổi HTML qua lại. Nếu bạn cần hỗ trợ về thương mại điện tử hoặc tích hợp API của sàn, hãy tham khảo dịch vụ hỗ trợ thương mại điện tử của Netalith hoặc liên hệ trực tiếp với tôi trên LinkedIn.

CÂU HỎI THƯỜNG GẶP

Câu hỏi thường gặp

Sự khác nhau giữa soup.prettify() và soup.decode() là gì?

decode() (phương thức mà str(soup) gọi) tuần tự hóa HTML một cách trung thực mà không thêm khoảng trắng. prettify() sử dụng cùng bộ tuần tự hóa nhưng bật chế độ định dạng đẹp, nên chèn thêm ký tự xuống dòng và thụt lề để dễ đọc.

Vì sao prettify() làm thay đổi cách hiển thị mô tả?

Khi prettify() đặt một phần tử inline trên dòng riêng, ký tự xuống dòng và phần thụt lề xung quanh nó sẽ được trình duyệt thu gọn thành một dấu cách. Điều này tạo ra khoảng trắng không có trong bản gốc — chẳng hạn một dấu cách trước dấu chấm sau một từ được in đậm.

Nên dùng phương thức nào để lưu mô tả HTML?

Hãy dùng str(soup) hoặc soup.decode(). Các phương thức này giữ nguyên cấu trúc HTML qua quá trình chuyển đổi mà không thêm khoảng trắng mang tính trình bày. Chỉ dùng prettify() cho việc gỡ lỗi và kiểm tra bằng mắt.

Khoảng trắng do prettify tạo ra có thể xuất hiện nguyên dạng không?

Có. Nếu mô tả được hiển thị trong ngữ cảnh giữ nguyên khoảng trắng như thẻ pre, textarea hoặc phần tử có white-space: pre, hay được hệ thống downstream xử lý dưới dạng văn bản thuần túy, mọi ký tự xuống dòng và dấu cách do prettify thêm vào sẽ xuất hiện nguyên dạng.

Cập nhật cùng Netalith

Nhận kiến thức công nghệ, cập nhật sản phẩm và ưu đãi đặc biệt qua email.