Cách để Lấy Dữ Liệu từ Trang Web sang Markdown: Hướng Dẫn Thực Hành
TL;DR
Chuyển đổi một trang web sang Markdown là một quy trình trích xuất, không phải là một hoạt động loại bỏ thẻ: xác định các trang chính, lấy biểu diễn đúng, cô lập nội dung chính, chuyển đổi cấu trúc và xác thực đầu ra.
Bắt đầu với danh sách URL có giới hạn hoặc sơ đồ website, tôn trọng quy tắc truy cập và tránh xem điều hướng, bảng cookie và khuyến nghị như văn bản bài viết.
Bảo tồn tiêu đề, liên kết, khối mã, bảng, URL chính và thời gian quan sát; những thứ này thường có giá trị hơn đối với hệ thống truy xuất hơn là HTML trang trí.
Một quy trình Python nhỏ có thể xử lý các trang tĩnh với httpx, Beautiful Soup và markdownify. Chỉ kết xuất JavaScript khi nội dung mục tiêu không có trong phản hồi ban đầu.
Đo lường độ trung thực của nội dung trên các trang mẫu trước khi lập chỉ mục toàn bộ trang web; Markdown trông sạch có thể vẫn bỏ sót các sự thật thiết yếu hoặc bao gồm trang sai.
Scrape một trang web sang Markdown có nghĩa là gì?
Scraping một trang web sang Markdown có nghĩa là thu thập các trang được ủy quyền và chuyển đổi nội dung có ý nghĩa của chúng thành định dạng văn bản mà vẫn giữ cấu trúc tài liệu. Kết quả vẫn nên hiển thị phân cấp tiêu đề, đoạn văn, liên kết, danh sách, mã và bảng. Một tệp đầy văn bản phẳng dễ tạo nhưng khó trích dẫn, cắt nhỏ hoặc xem xét.
Công việc có hai phần tách biệt. Khám phá xác định các URL nào thuộc phạm vi. Trích xuất xác định phần nào của mỗi trang đã lấy là nội dung thực sự. Một thư viện chuyển đổi có thể xử lý cú pháp HTML sang Markdown, nhưng nó không thể biết liệu một modal bản tin có phải là một phần của bài viết hay liệu một biến thể sản phẩm có được chọn đúng cách hay không. hướng dẫn khám phá URL website đề cập đến vấn đề đầu tiên; hướng dẫn này tập trung vào vấn đề thứ hai.
Đối với các trang web lớn hoặc có nhiều JavaScript, Nstdata Crawl là một tùy chọn thu thập để đánh giá trên các trang công khai đại diện. Dù bạn sử dụng dịch vụ quản lý hay Python cục bộ, đầu ra vẫn cần kiểm soát phạm vi, nguồn gốc và xem xét của con người.
Trải nghiệm Nstproxy Crawl - Bắt Đầu Dùng Thử Miễn Phí Hôm Nay
Bước 1: Xác định hợp đồng nguồn và đầu ra
Bắt đầu với danh sách rõ ràng các URL mà bạn được phép xử lý. Một sơ đồ website là một điểm khởi đầu thuận tiện, nhưng hãy lọc nó theo tên miền và tiền tố đường dẫn. Loại bỏ các URL đăng nhập, giỏ hàng, tìm kiếm và các URL tham số trùng lặp trừ khi chúng là một phần của nhiệm vụ. Tổng quan về sitemap của Google mô tả các sitemap như là gợi ý khám phá, không phải là bảo đảm rằng các trang được liệt kê là hợp lệ hoặc đầy đủ.
Xác định bản ghi Markdown mong muốn trước khi lập trình. Một điều tối thiểu hữu ích là source_url, final_url, title, fetched_at, content_hash, và markdown. Nếu một trang có thể thay đổi theo địa phương, tài khoản hoặc tùy chọn sản phẩm, hãy ghi lại ngữ cảnh đó. Đừng tạo tên tệp chỉ từ một URL thô; các đường dẫn dài, chuỗi truy vấn và va chạm khiến điều đó trở nên không đáng tin cậy. Sử dụng một slug ổn định cộng với một hash hoặc khóa cơ sở dữ liệu.
Đặt một mục tiêu chất lượng: ví dụ, Markdown phải giữ lại mọi H2, các ví dụ mã chính và các trích dẫn ra ngoài trong khi loại bỏ menu và điều hướng chân trang. Mục tiêu đó có thể được kiểm tra trên một mẫu. Một số lượng ký tự cao không phải là một chỉ số chất lượng nếu phần lớn các ký tự là nội dung mặc định.
Bước 2: Lấy một trang với các yêu cầu có giới hạn
Ví dụ sau sử dụng Python 3, httpx, Beautiful Soup và markdownify. Cài đặt chúng bằng lệnh python -m pip install httpx beautifulsoup4 markdownify. Mã yêu cầu một URL công khai đơn lẻ, đặt thời gian chờ, kiểm tra loại nội dung và chuyển đổi phần tử main của trang khi có sẵn. Việc quay lại article hoặc body là cố ý thận trọng chỉ để minh họa; hãy kiểm tra bố cục của trang web mục tiêu của bạn trước khi chạy trên quy mô lớn.
from datetime import datetime, timezone
from hashlib import sha256
from urllib.parse import urlparse
import httpx
from bs4 import BeautifulSoup
from markdownify import markdownify as to_markdown
defpage_to_markdown(url:str)->dict[str,str]: parsed = urlparse(url)if parsed.scheme notin{"http","https"}:raise ValueError("Only HTTP(S) URLs are allowed")with httpx.Client( timeout=15.0, follow_redirects=True, headers={"User-Agent":"ContentResearchExample/1.0"},)as client: response = client.get(url) response.raise_for_status() content_type = response.headers.get("content-type","").lower()if"text/html"notin content_type:raise ValueError(f"Expected HTML, got {content_type}") soup = BeautifulSoup(response.text,"html.parser")for node in soup.select("script, style, nav, footer, aside, form"): node.decompose() main = soup.select_one("main")or soup.select_one("article")or soup.body
if main isNone:raise ValueError("No content container found") title = soup.title.get_text(" ", strip=True)if soup.title else"Untitled"markdown = to_markdown(str(main), heading_style="ATX").strip()iflen(markdown)<40:raise ValueError("Nội dung được trích xuất ngắn một cách không mong đợi")return{"source_url": url,"final_url":str(response.url),"title": title,"fetched_at": datetime.now(timezone.utc).isoformat(),"content_hash": sha256(markdown.encode()).hexdigest(),"markdown": markdown,}if __name__ =="__main__": record = page_to_markdown("https://example.com/")print(record["title"])print(record["markdown"][:300])
Ví dụ này cố ý không đệ quy hoặc vượt qua quyền truy cập. Bảo vệ len bắt giữ một kết quả rõ ràng là rỗng, không phải là một kết quả nội dung sai. Kiểm tra trên các trang có bảng, khối mã và liên kết nội tuyến trước khi tin tưởng vào bộ chuyển đổi. Định nghĩa phần tử main trong thông số HTML là một điểm khởi đầu ngữ nghĩa hữu ích, nhưng nhiều trang không sử dụng nó một cách nhất quán.
Bước 3: Cải thiện việc chọn nội dung chính
Bộ chọn rộng trong ví dụ chỉ là một cơ sở. Một bộ trích xuất sản xuất nên sử dụng một quy tắc cụ thể theo nguồn khi trang có một cấu trúc bài viết ổn định, và trở lại với một bộ trích xuất theo phong cách khả năng đọc khi bố cục thay đổi. So sánh trang nguồn và Markdown bên cạnh nhau. Tìm kiếm các phần giới thiệu bị thiếu, tiêu đề trùng lặp, chú thích nội tuyến, thẻ bài viết liên quan, và nội dung được chèn dưới bài viết.
Không xóa mỗi aside một cách mù quáng khi một aside biên tập chứa cảnh báo hoặc định nghĩa. Tương tự, việc xóa tất cả các bảng hoặc hình ảnh có thể loại bỏ chỉ đại diện duy nhất cho một thông số. Thay thế hình ảnh có ý nghĩa bằng văn bản thay thế hoặc liên kết khi việc sử dụng xuống dòng của bạn cần chúng. Đối với các mẫu mã, xác minh rằng thụt lề và hàng rào sống sót qua chuyển đổi. Đối với các liên kết, ưa chuộng các URL tuyệt đối và giữ cho văn bản liên kết mô tả; nếu không, trích dẫn trong câu trả lời thu hồi có thể dẫn tới bất kỳ đâu.
Hướng dẫn phương pháp trích xuất HTML so sánh các phương pháp phân tích. Đối với một tập hợp thu hồi, việc bảo tồn cấu trúc thường quan trọng hơn việc tối đa hóa nén văn bản thuần. Phân đoạn chỉ sau khi bạn đã kiểm tra một tài liệu trung thành, và giữ các đường dẫn tiêu đề với mỗi đoạn.
Bước 4: Xử lý các trang được tạo bằng JavaScript một cách cẩn thận
Nếu phản hồi HTTP ban đầu chỉ chứa một shell ứng dụng, ví dụ Python không thể trích xuất bài viết vì văn bản sẽ đến sau thông qua các yêu cầu phía khách hàng. Xác nhận điều này bằng cách xem thân phản hồi và DOM đã được trình duyệt tạo. Sau đó chọn một API nguồn được ủy quyền, một bộ kết xuất trình duyệt, hoặc một dịch vụ kết xuất được quản lý. Không kết xuất mỗi trang theo mặc định: điều này làm tăng độ trễ, chi phí và điểm thất bại mà không giúp ích cho các trang tĩnh.
Hướng dẫn Python cho các trang được tạo bằng JavaScript giải thích chẩn đoán này chi tiết hơn. Khi sử dụng một bộ kết xuất, hãy đợi một tín hiệu cụ thể về nội dung thay vì một giấc ngủ cố định. Một trang có thể hoàn thiện về mặt hình ảnh trong khi một bảng hoặc danh sách trích dẫn vẫn đang tải. Ghi lại liệu kết quả đến từ HTML nguồn hay DOM đã được kết xuất vì cùng một URL có thể tạo ra nội dung khác nhau ở mỗi đường dẫn.
Nếu quyền truy cập yêu cầu xác thực, chỉ sử dụng tài khoản và nội dung mà bạn rõ ràng được ủy quyền để xử lý. Không biến một phiên trình duyệt thành giấy phép ngầm để thu thập các trang riêng tư. Đối với các trang công khai, kiểm tra robots.txt và điều khoản trang; RFC 9309 định nghĩa giao thức robots, không phải tập hợp đầy đủ các quyền pháp lý để tái sử dụng nội dung.
Bước 5: Xác thực và lưu trữ Markdown
Tạo một mẫu thử nghiệm bao gồm các loại trang khó nhất của trang web: trang ngắn, bài viết dài, bảng, mã, danh sách lồng nhau, và các trang với nhiều khuyến nghị. Đối với mỗi mẫu, so sánh các tiêu đề chính, đoạn đầu và cuối, một sự thật đã biết, các liên kết, và bất kỳ khối mã quan trọng nào. Đánh dấu một trang là thất bại khi nội dung quan trọng bị thiếu ngay cả khi Markdown là hợp lệ về mặt cú pháp.
Xóa trùng lặp theo URL chuẩn và băm nội dung, nhưng giữ một lịch sử quan sát. Sự thay đổi băm có thể có nghĩa là một chỉnh sửa có ý nghĩa hoặc chỉ đơn giản là một thẻ khuyến nghị xoay vòng. So sánh sự khác biệt nội dung chính trước khi lập chỉ mục lại. Lưu lại nguồn thô hoặc đã được kết xuất theo chính sách lưu giữ để các lỗi trích xuất có thể được điều tra. Nếu nội dung chứa dữ liệu cá nhân, chỉ giữ những gì trường hợp sử dụng cần và phát tán việc xóa đến các bản sao và chỉ mục.
Đối với một quy trình làm việc thu hồi, lưu trữ metadata cùng với mỗi tệp Markdown hoặc đoạn: URL, tiêu đề, đường dẫn tiêu đề, thời gian thu hồi, phiên bản nguồn, và quyền truy cập. Hướng dẫn LlamaIndex về thu thập dữ liệu web và RAG cung cấp một ngữ cảnh thu thập rộng hơn. Đừng gán nhãn một câu trả lời thu hồi là “trực tiếp” chỉ vì tệp Markdown được tạo ra với một trình thu thập web một lần.
Những sai lầm phổ biến và cách chẩn đoán chúng
Nếu mọi tệp đều bắt đầu với cùng một văn bản điều hướng, bộ chọn nội dung quá rộng. Nếu các tệp gần như trống, hãy kiểm tra xem trang có được Javascript-rendered, bị chặn, chuyển hướng hay đơn giản là không phải là một bài viết. Nếu các liên kết trở nên tương đối, hãy giải quyết chúng so với URL cuối cùng được lấy trước khi chuyển đổi. Nếu một bảng bị gộp lại thành một đoạn văn, hãy chọn một trình chuyển đổi hoặc bước xử lý hậu để bảo toàn nghĩa của bảng và xác minh kết quả một cách thủ công.
Nếu các trang trùng lặp xuất hiện, chỉ chuẩn hóa những tham số thực sự không liên quan; đừng hợp nhất các biến thể sản phẩm hoặc ngôn ngữ. Nếu tiêu đề bị thiếu, hãy kiểm tra xem chúng có được hiển thị dưới dạng các phần tử div có kiểu dáng thay vì tiêu đề ngữ nghĩa hay không. Một quy trình làm việc đáng tin cậy nên báo cáo những điều này như là ngoại lệ loại trang thay vì lặng lẽ xuất ra Markdown kém.
Kết luận
Việc trích xuất từ trang web sang Markdown tốt là một quá trình biến đổi được kiểm soát với một tập nguồn rõ ràng, một bộ chọn nội dung chính trung thành, chuyển đổi cấu trúc và xác minh mẫu. Bắt đầu với một vài trang công cộng đại diện, so sánh nguồn và đầu ra, sau đó mở rộng phạm vi URL. Bảo tồn nguồn gốc để mọi đoạn văn trong một hệ thống tìm kiếm hoặc RAG phía hạ nguồn đều có thể được truy dấu tới một trang và thời gian quan sát.
Kiểm tra quy trình làm việc từ trang sang Markdown
Nếu phân tích cục bộ không bao phủ các loại trang được ủy quyền của bạn, đánh giá Nstdata Crawl trên một tập nhỏ với các tiêu đề và liên kết đã biết mong đợi. Giữ nguyên hợp đồng xác thực và siêu dữ liệu bất kể công cụ thu thập.
Q: Tôi có thể chuyển đổi toàn bộ trang web sang Markdown với một yêu cầu không?
Không. Một yêu cầu chuyển đổi một phản hồi. Một quy trình làm việc trên toàn trang cũng cần phát hiện URL có giới hạn, lấy dữ liệu theo từng trang, loại bỏ trùng lặp, lập lịch và xác thực.
Q: Markdown có nên bao gồm hình ảnh không?
Markdown nên giữ lại những hình ảnh có ý nghĩa dưới dạng liên kết hoặc văn bản thay thế khi chúng truyền đạt thông tin cần thiết cho phía hạ nguồn. Hình ảnh trang trí thường có thể bị bỏ qua, nhưng biểu đồ và sơ đồ có thể yêu cầu trích xuất hoặc mô tả riêng.
Q: Markdown có tốt hơn HTML cho RAG không?
Markdown thường dễ kiểm tra và phân đoạn hơn, nhưng độ trung thực quan trọng hơn định dạng. Nếu quá trình chuyển đổi loại bỏ bảng, trích dẫn hoặc mã, HTML gốc hoặc một biểu diễn phong phú hơn có thể tốt hơn.
Q: Làm thế nào tôi biết một trang có cần render bằng JavaScript không?
So sánh phản hồi HTTP ban đầu với trang đã được render. Nếu nội dung cần thiết bị thiếu trong phản hồi nhưng có mặt sau khi thực thi phía client, hãy sử dụng một đường dẫn render hoặc API được ủy quyền và kiểm tra để hoàn thành nội dung cụ thể.
Lena Zhou
Oct. 13th 2026
Thu thập toàn bộ trang web chỉ với một yêu cầu API
Tỷ lệ thành công 99,8% với kết xuất JavaScript
Nhận dữ liệu sạch, sẵn sàng cho LLM ở nhiều định dạng
Chuyển mọi trang web thành Markdown, HTML, JSON, liên kết, PDF và hơn thế nữa mà không cần quản lý hạ tầng thu thập dữ liệu.