🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

resiliparse Web Scraping: Trích xuất HTML thành văn bản nhanh chóng

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

23-Jul-2026

Tóm tắt:

  • resiliparse chuyển đổi HTML thành văn bản sạch một cách nhanh chóng, sử dụng lõi trích xuất C++ được xây dựng để xử lý các kho lưu trữ web ở quy mô hàng tỷ trang.
  • main_content=True loại bỏ phần nội dung thừa. Nó trả về văn bản bài viết mà không có điều hướng, đăng nhập và chân trang mà một bản sao văn bản naivet giữ lại.
  • Điều mà resiliparse không làm là gọi dữ liệu. Nó không có khách hàng HTTP và không chạy JavaScript; đưa cho nó mã định dạng và nó sẽ trích xuất.
  • Khoảng cách xuất hiện trong một kịch bản. Một GET đơn giản trên một trang demo được thực thi bằng JavaScript cho ra 23 ký tự văn bản; cùng URL được gọi thông qua API Lấy dữ liệu Universal Scrapeless với js_render sẽ cung cấp nội dung thực sự.
  • Quá trình trích xuất là thực trong hướng dẫn này. Một lần chạy trực tiếp đã giảm 10,968 ký tự HTML đã được thực thi xuống còn 1,469 ký tự của văn bản nội dung chính sạch.
  • Miễn phí để bắt đầu ở phía gọi dữ liệu. Tạo khóa API Scrapeless của bạn tại app.scrapeless.com.

resiliparse là gì, và nó không phải là gì

resiliparse là phần phân tích và trích xuất của bộ công cụ ChatNoir Resiliparse, được phát triển bởi nhóm nghiên cứu Lưu trữ Web để xử lý Common Crawl và các tập dữ liệu tương tự. Quá trình trích xuất HTML thành văn bản của nó chạy trong lõi C++, đó là lý do tại sao nó vẫn nhanh khi đầu vào là hàng triệu tài liệu thay vì một. Hàm mà bạn thường xuyên sử dụng nhất là extract_plain_text, và chế độ main_content=True của nó là phần hữu ích: nó loại bỏ điều hướng, thanh bên và chân trang làm cho việc sao chép văn bản thô trở nên lộn xộn, để lại nội dung mà người đọc thực sự tìm đến.

Đây là một thư viện trích xuất, không phải là một công cụ thu thập dữ liệu. resiliparse không có khách hàng HTTP, không giữ phiên và không chạy JavaScript. Đưa cho nó một chuỗi hoặc byte và nó sẽ trả về văn bản; yêu cầu nó lấy một URL và sẽ không có phương thức cho điều đó. Vì vậy, mỗi thiết lập "cào web resiliparse" là hai lớp: một cái gì đó trả về HTML chính xác, và resiliparse trích xuất từ đó. Hướng dẫn này sử dụng API Lấy dữ liệu Universal Scrapeless cho lớp đầu tiên, vì một khách hàng HTTP đơn giản trả về mã định dạng trước khi thực thi trên bất kỳ trang nào xây dựng nội dung của nó bằng JavaScript — và mã định dạng rỗng trích xuất thành văn bản rỗng. Đối với các trường có cấu trúc thay vì văn bản dễ đọc, hướng dẫn thu thập dữ liệu web Python đề cập đến con đường dựa trên bộ chọn.

Cài đặt

resiliparse và requests là toàn bộ chuỗi công cụ. Phiên bản mà hướng dẫn này được viết trên là resiliparse 1.0.9:

bash Copy
pip install "resiliparse==1.0.9" requests

Giữ khóa của bạn trong môi trường, không bao giờ trong mã nguồn:

bash Copy
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

Lấy HTML đáng để trích xuất

Chất lượng trích xuất bị giới hạn bởi độ chính xác của việc lấy dữ liệu, vì vậy hãy bắt đầu từ đó. Trên một trang được thực thi bằng JavaScript, mã định dạng mà một khách hàng HTTP đơn giản nhận được không chứa bất kỳ nội dung nào — nó chỉ đến sau khi các tập lệnh xây dựng DOM, một vòng đời được định nghĩa bởi quy chuẩn lập trình HTML. Một kịch bản cho thấy những gì resiliparse nhận được từ mỗi phần:

python Copy
# fidelity.py — điều mà resiliparse trích xuất: GET đơn giản so với kết xuất phía máy chủ
import os

import requests
from resiliparse.extract.html2text import extract_plain_text

URL = "https://quotes.toscrape.com/js/"
MARKER = "Thế giới như chúng ta đã tạo ra"

plain = requests.get(URL, timeout=60).text
plain_text = extract_plain_text(plain, main_content=True)
print("số ký tự văn bản thô:", len(plain_text), "| có trích dẫn:", MARKER in plain_text)

resp = requests.post(
    "https://api.scrapeless.com/api/v2/unlocker/request",
    headers={"Content-Type": "application/json", "x-api-token": os.environ["SCRAPELESS_API_KEY"]},
    json={"actor": "unlocker.webunlocker", "input": {"url": URL, "js_render": True}},
    timeout=120,
)
resp.raise_for_status()
rendered_text = extract_plain_text(resp.json().get("data", ""), main_content=True)
print("số ký tự văn bản đã kết xuất:", len(rendered_text), "| có trích dẫn:", MARKER in rendered_text)

Lấy dữ liệu thô trích xuất gần như không có gì; phần đã được thực thi mang theo nội dung thực sự:

text Copy
số ký tự văn bản thô: 23 | có trích dẫn: False
số ký tự văn bản đã kết xuất: 1435 | có trích dẫn: True

Việc kết xuất, mở khóa và định tuyến proxy đều diễn ra ở phía máy chủ trong một POST đó — API Lấy dữ liệu Universal là lớp gọi dữ liệu, và các byte đã kết xuất là điều mà resiliparse nên trích xuất từ đó.

Trích xuất văn bản sạch

Với HTML thực sự trong tay, resiliparse thực hiện quá trình trích xuất. Chạy nó một lần với các mặc định và một lần với main_content=True để thấy phần nội dung thừa được loại bỏ:

python Copy
# extract.py — trích xuất toàn bộ văn bản so với trích xuất nội dung chính
import os

import requests

from resiliparse.extract.html2text import extract_plain_text

resp = requests.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
headers={"Content-Type": "application/json", "x-api-token": os.environ["SCRAPELESS_API_KEY"]},
json={"actor": "unlocker.webunlocker", "input": {"url": "https://quotes.toscrape.com/", "js_render": True}},
timeout=120,
)
resp.raise_for_status()
html = resp.json().get("data", "")

full = extract_plain_text(html)
main = extract_plain_text(html, main_content=True)
print("số ký tự html đã hiển thị:", len(html))
print("số ký tự văn bản đầy đủ:", len(full))
print("số ký tự nội dung chính:", len(main))
print("có câu trích dẫn đầu tiên:", "Thế giới như chúng ta đã tạo ra" in main)

Kết quả cho thấy 10.968 ký tự HTML đã được chuyển đổi thành văn bản có thể đọc được, và main_content còn cắt bớt các phần không cần thiết nữa:

text Copy
số ký tự html đã hiển thị: 10968
số ký tự văn bản đầy đủ: 1674
số ký tự nội dung chính: 1469
có câu trích dẫn đầu tiên: True

Đó là toàn bộ quy trình: một POST để lấy và hiển thị, một cú gọi để trích xuất. main_content=True là yếu tố giúp đầu ra sạch sẽ để nuôi một mô hình ngôn ngữ hoặc chỉ số tìm kiếm — các phần điều hướng và lời nhắc đăng nhập còn sót lại sau khi lấy toàn bộ văn bản đã biến mất, và văn bản trích dẫn còn lại.

Nhận khóa API của bạn trên gói miễn phí: app.scrapeless.com

Các mẫu nâng cao

  • Truyền byte, không phải chuỗi đã giải mã, khi mã hóa không chắc chắn. resiliparse phát hiện mã hóa từ tài liệu; việc truyền byte phản hồi thô giúp tránh việc giải mã hai lần làm rối văn bản không phải ASCII.
  • Sử dụng cờ alt_textslinks để giữ lại hoặc bỏ qua chi tiết. extract_plain_text chấp nhận các cờ bảo lưu văn bản mô tả hình ảnh hoặc mục tiêu liên kết khi bạn cần và bỏ qua chúng khi không cần.
  • Sử dụng resiliparse.parse.html khi bạn cần cây. Bộ công cụ cũng cung cấp một cây HTML và API chọn lọc, vì vậy bạn có thể trích xuất các trường có cấu trúc từ cùng một lõi nhanh khi văn bản thuần không đủ.
  • Giữ các bước lấy dữ liệu và trích xuất tách biệt. Việc trích xuất bị ràng buộc bởi CPU và việc lấy dữ liệu bị ràng buộc bởi IO; lấy trang trước, sau đó tiến hành trích xuất trên lô, để không bước nào chờ đợi bước còn lại.

Giải quyết sự cố

  • Hầu như không có văn bản từ một trang mà bạn có thể thấy trong trình duyệt. Nội dung được hiển thị bằng JavaScript và việc lấy dữ liệu của bạn đã trả về HTML trước khi hiển thị. Kết quả 23 ký tự của script đầu tiên chính xác là trường hợp này; khắc phục ở lớp lấy dữ liệu với js_render.
  • Văn bản điều hướng và chân trang trong đầu ra. Bạn đã gọi extract_plain_text mà không có main_content=True. Bật nó lên để loại bỏ các phần không cần thiết.
  • Các ký tự có dấu bị rối. Bạn đã truyền một chuỗi bị giải mã sai cho resiliparse. Truyền các byte phản hồi và để nó phát hiện mã hóa.
  • Nội dung bạn muốn bị cắt bớt. main_content là thiết kế khắt khe. Đối với các trang có cấu trúc không bình thường, hãy so sánh với đầu ra văn bản đầy đủ và quay lại khi quá trình nội dung chính loại bỏ quá nhiều.

Kết luận

resiliparse xứng đáng có vị trí như lớp trích xuất có thể mở rộng: một lõi C++ chuyển đổi HTML thành văn bản sạch nhanh chóng, với chế độ main_content loại bỏ các phần không cần thiết. Lớp quyết định việc bất kỳ điều gì trong số đó có thể là lớp lấy dữ liệu — sự phân chia 23 so với 1.435 ký tự của script đầu tiên đã chứng minh điều đó — và một POST được hiển thị trên máy chủ đã thu hẹp khoảng cách đó. Kết nối cả hai lại và một trang đã được hiển thị trở thành văn bản sạch, sẵn sàng cho một chỉ số hoặc một mô hình.

Tạo một tài khoản Scrapeless miễn phí để nhận khóa API, và tài liệu dành cho nhà phát triển bao gồm các tham số unlocker.webunlocker. Kiểm tra giá cả Scrapeless khi bạn lên kế hoạch cho một công việc định kỳ.

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

H: resiliparse có thể thu thập dữ liệu từ các trang web một mình không?

Không. resiliparse trích xuất văn bản từ HTML mà bạn đã có; nó không có khách hàng HTTP và không chạy JavaScript. Kết hợp nó với một lớp lấy dữ liệu — ở đây là API Thu thập dữ liệu Đa năng Scrapeless, cái mà render trang ở phía máy chủ — và resiliparse xử lý việc trích xuất văn bản từ các byte đã được trả về.

H: resiliparse khác gì so với một công cụ loại bỏ nội dung như trafilatura?

Cả hai đều loại bỏ nội dung dư thừa, nhưng resiliparse đến từ nhóm nghiên cứu Lưu trữ Web và được xây dựng bằng C++ cho khả năng thông qua quy mô tập đoàn, và nó được vận chuyển như một phần của bộ công cụ rộng hơn cũng đọc tệp WARC và phát hiện mã hóa và ngôn ngữ. Hãy sử dụng nó khi tốc độ trên nhiều tài liệu là yếu tố ràng buộc.

H: main_content=True thực sự làm gì?
Nó thực hiện một lần chạy trích xuất nội dung giữ lại văn bản bài viết chính và loại bỏ điều hướng, thanh bên, tiêu đề và chân trang. So sánh trong hướng dẫn này cho thấy đầu ra đã được cắt gọn so với đầu ra toàn bộ văn bản để bạn có thể thấy những gì bị loại bỏ.

Q: Liệu resiliparse có xử lý các trang được render bằng JavaScript không?

Không, nó không tự xử lý - nó không bao giờ thực thi các tập lệnh. Nếu nội dung tải sau HTML ban đầu, một lần fetch thông thường sẽ trích xuất hầu như không có gì, như kết quả 23 ký tự cho thấy. Hãy fetch trang thông qua API Scrapeless với js_render trước, sau đó trích xuất.

Q: Việc scraping với resiliparse có hợp pháp không?

Thư viện trích xuất không thay đổi các quy tắc thu thập. Chỉ lấy các trang công khai, tôn trọng các điều khoản của site và các chỉ thị của robots được tiêu chuẩn hóa bởi Giao thức loại trừ Robots, giữ lượng dữ liệu trong giới hạn và xử lý bất kỳ dữ liệu cá nhân nào theo các luật áp dụng cho bạn.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục