Cách phân tích HTML trong Python
Công cụ Mở khóa Web không cần thu thập có thể cung cấp HTML của trang công khai đã được lấy hoặc xử lý cho các chương trình Python thực hiện phân tích và kiểm tra của riêng chúng.
Tóm tắt
- Việc phân tích HTML bắt đầu sau khi thu nhận. Kiểm tra xem phản hồi có phải là trang mong muốn trước khi xây dựng cây.
- Python cung cấp các bộ phân tích bên trong và bên thứ ba. Chọn một cái có chủ đích vì mã đánh dấu sai có thể tạo ra những cây khác nhau.
- Chọn lọc nằm trong một bản ghi. Trích xuất các trường liên quan từ cùng một thẻ hoặc hàng để tránh trộn lẫn các mục gần kề.
- Phân tích không thể chạy JavaScript trên trang. Nếu mục tiêu chỉ xuất hiện sau khi trình duyệt thực thi, hãy thay đổi đường dẫn thu nhận.
Để phân tích HTML trong Python, lấy mã đánh dấu, xây dựng một cây tài liệu, chọn các phần tử liên quan và chuẩn hóa các giá trị bạn tìm thấy. Bộ phân tích chỉ là một giai đoạn. Nếu trang đã lấy là một thông báo đăng nhập hoặc một shell JavaScript, mã bộ chọn hoàn hảo vẫn có thể tạo ra kết quả sai. Bắt đầu bằng cách ghi chép lại các trường chính xác bạn cần và dấu hiệu trên trang cho thấy tài liệu được trả về là mục tiêu.
Quy trình này áp dụng cho dù HTML đến từ một tệp lưu cục bộ, một yêu cầu HTTP được phép, hay một dịch vụ xử lý. BeautifulSoup là một thư viện thuận tiện để điều hướng và chọn CSS, trong khi html.parser tiêu chuẩn của Python cung cấp các callback sự kiện cấp thấp hơn. Sự lựa chọn nên theo nhiệm vụ trích xuất. Một trang nhỏ với một vài thẻ ổn định là khác với mã đánh dấu sai chứa các thẻ lồng nhau và các giá trị tùy chọn.
Lấy đúng HTML trước khi phân tích nó
Một máy khách HTTP tải về phản hồi ban đầu; nó không tự động thực thi các script trên trang. Kiểm tra URL cuối, trạng thái, loại phương tiện, và một dấu hiệu mong đợi trong phần thân phản hồi. Một trang có thể trả về 200 và text/html trong khi chứa thông báo thay vì tập dữ liệu. Lưu một phản hồi đại diện nhỏ trong quá trình phát triển, với thông tin xác thực bị xóa, để các thay đổi bộ chọn có thể được thử nghiệm chống lại các byte chính xác đã tạo ra kết quả trước đó.
Chuẩn tiêu chuẩn ngữ nghĩa HTTP giải thích tại sao trạng thái và siêu dữ liệu đại diện lại tách biệt khỏi ý nghĩa ứng dụng của thân. Đối với việc phân tích, điều đó có nghĩa là coi sự thành công của việc thu thập là cần thiết nhưng không đủ. Nếu phản hồi bị nén hoặc mã hóa, hãy để một thư viện HTTP trưởng thành giải mã nó theo siêu dữ liệu đã công bố. Tránh giả định thủ công UTF-8 cho mọi trang kế thừa.
Nếu các bản ghi không có trong phản hồi thô nhưng hiển thị sau khi trang tải trong trình duyệt, hãy kiểm tra bảng điều khiển mạng để tìm phản hồi cấu trúc được phép. Khi thực thi trình duyệt thực sự được yêu cầu, sử dụng một đường dẫn xử lý như đã tài liệu Web Unlocker JS Render. Nó có thể trả về HTML sau khi thực thi; bộ phân tích Python sau đó làm việc trên đại diện đã trả về đó. Việc xử lý thay đổi nơi mã đánh dấu đến từ, không phải cách BeautifulSoup diễn giải nó.
Xây dựng một cây phân tích với một backend rõ ràng
BeautifulSoup chấp nhận mã đánh dấu và một backend bộ phân tích được đặt tên, chẳng hạn như html.parser tích hợp của Python. Tài liệu chính thức của nó giải thích cách một cây thẻ, văn bản, và thuộc tính có thể được tìm kiếm. Ghi lại bộ phân tích trong mã thay vì cho phép giá trị mặc định phụ thuộc vào môi trường. Các backend khác nhau có thể sửa mã HTML sai khác nhau, thay đổi mối quan hệ cha-con và do đó kết quả của bộ chọn.
Đối với một đầu vào nhỏ tự chứa, tưởng tượng một phần tử bài viết chứa một tiêu đề h2, một liên kết với href, và một span giữ giá. Xây dựng một soup từ mã đánh dấu đó, chọn bản ghi trước, sau đó đọc từng trường bên trong nó. Phạm vi này quan trọng: việc chọn mỗi h2 trên trang và mỗi giá trong span riêng lẻ có thể tạo ra danh sách không khớp khi một bài viết thiếu giá. Một bộ phân tích hướng đến bản ghi coi mỗi bài viết là đơn vị trích xuất.
Mô-đun html.parser của Python là một lựa chọn khác khi bạn muốn callback khi các thẻ và dữ liệu được đọc. Nó không cung cấp cùng một giao diện lựa chọn CSS và điều hướng cây thuận tiện như BeautifulSoup. Chọn nó cho một nhiệm vụ kiểu truyền phát hẹp, không phải vì nó thường đúng hơn. Kiểm tra bộ phân tích được chọn trên các trang đại diện có mã sai và được hình thành tốt.
Chọn Các Trường Sử Dụng Cấu Trúc Ổn Định
Một bộ chọn CSS có thể nhắm đến một phần tử ngữ nghĩa, một thuộc tính ổn định, hoặc một mối quan hệ cha-con ngắn. Sử dụng một bộ chọn như article[data-id] khi trang cung cấp các ID có ý nghĩa, sau đó chọn tiêu đề và liên kết trong mỗi bài viết. Tránh một chuỗi dài các tên lớp được tạo ra liên quan đến bố cục hình ảnh. Những lớp đó có thể thay đổi trong quá trình thiết kế lại ngay cả khi các trường dữ liệu vẫn giống nhau về khái niệm.
Phương thức select của BeautifulSoup chấp nhận cú pháp bộ chọn CSS, trong khi find và find_all hữu ích khi bạn cần kiểm tra thuộc tính hoặc điều kiện tùy chỉnh. Các bộ chọn nên thể hiện hợp đồng bản ghi, không chỉ đơn giản là xảy ra để trả về số lượng đúng hôm nay. Kiểm tra văn bản và thuộc tính của phần tử được chọn trên một trang đại diện. Nếu một trường bị thiếu là hợp pháp, hãy thể hiện nó một cách rõ ràng dưới dạng null hoặc một giá trị tùy chọn rỗng thay vì dịch chuyển các trường tiếp theo vào bản ghi sai.
Chuẩn hóa các giá trị đã trích xuất sau khi chọn. Thu gọn khoảng trắng bố cục cho văn bản hiển thị, lưu giữ một giá trị thô gốc khi độ chính xác quan trọng, và giải quyết các giá trị href tương đối so với URL phản hồi cuối cùng. Đừng sử dụng URL được yêu cầu làm cơ sở sau khi một chuyển hướng không quan sát. Nếu một trang liệt kê giá cả bằng nhiều loại tiền tệ, hãy giữ loại tiền tệ bên cạnh giá trị số thay vì loại bỏ mọi ký tự không phải chữ số và mất đi ý nghĩa.
Kiểm Tra Bản Ghi, Không Chỉ Bộ Chọn
Một bộ chọn trả về một nút không chứng minh rằng nút đó là bản ghi mong đợi. Kiểm tra một dấu chỉ trang duy nhất, ID bản ghi hoặc URL chính thức, và các trường cần thiết. Xác minh rằng một liên kết trỏ đến một máy chủ được cho phép và rằng tiêu đề không rỗng. Nếu một trường là tùy chọn, định nghĩa sự vắng mặt của nó trong lược đồ. Một kết quả phân tích với mười nút vẫn có thể chứa các thẻ trùng lặp hoặc các đoạn giới thiệu điều hướng thay vì các mục mong muốn.
Phân trang thêm một ranh giới khác. Theo dõi một liên kết tiếp theo đã được xác minh hoặc con trỏ đã được ghi chép, giữ một tập hợp các URL hoặc ID bản ghi đã chuẩn hóa đã truy cập và dừng lại tại một điều kiện kết thúc rõ ràng. Số lượng trang cố định là một giới hạn, không phải là bằng chứng cho thấy bộ sưu tập đã kết thúc một cách tự nhiên. Đo lường số bản ghi được chấp nhận, số bản ghi bị từ chối và các lần bỏ lỡ bộ chọn một cách riêng biệt để sự thay đổi bố cục là có thể nhìn thấy trước khi phân tích xuống dòng coi một lô phần không hoàn chỉnh là hoàn chỉnh.
Một thiết bị nhỏ được lấy từ HTML công khai được phép có thể giúp kiểm tra logic trích xuất thuần túy, nhưng nó không chứng minh rằng con đường thu mua trực tiếp vẫn trả lại HTML đó. Giữ một kiểm tra tích hợp thu thập một trang hiện tại và xác minh danh tính. Các liên quan Hướng dẫn khai thác web BeautifulSoup tách biệt việc thu thập tĩnh khỏi việc hiển thị động chính xác vì lý do này.
Quyết định Khi nào Hiển thị hoặc Sử dụng Dữ liệu Cấu trúc
Khi HTML thô đã chứa các trường mục tiêu, việc hiển thị một trình duyệt tăng thêm thời gian và trạng thái mà không cải thiện việc trích xuất. Khi trang gọi một điểm cuối JSON đã được ủy quyền mà xuất bản các trường cần thiết, đọc phản hồi đó có thể đơn giản hơn so với việc tái tạo văn bản hiển thị từ DOM. Khi các tương tác hoặc mã khách hàng tạo ra các phần tử mục tiêu, một trình duyệt hoặc dịch vụ hiển thị là phù hợp. Đưa ra quyết định này từ các phản hồi đã quan sát, không phải từ nhãn như “trang hiện đại.”
Sản phẩm trang sản phẩm Web Unlocker mô tả việc truy xuất nội dung công khai với tùy chọn hiển thị bằng JavaScript. Một kịch bản Python có thể chuyển HTML đã trả về cho BeautifulSoup, nhưng vẫn nên kiểm tra phản hồi dịch vụ và dấu chỉ trang trước khi phân tích. Đừng giả định rằng đầu ra đã hiển thị là hoàn chỉnh chỉ vì các kịch bản đã chạy; dữ liệu lười và các lượt xem sau tương tác có thể yêu cầu một bước tài liệu khác.
Tôn trọng quy tắc truy cập trang web và tải hoạt động. Chỉ phân tích các trang mà bạn được phép thu thập, giới hạn yêu cầu và tránh giữ thông tin cá nhân mà ứng dụng của bạn không cần. Những quyết định này thuộc về bộ phân tích, không phải bên trong một bộ chọn CSS. Một trích xuất kỹ thuật chính xác vẫn có thể là một thực hành dữ liệu không phù hợp nếu phạm vi, mục đích hoặc việc giữ lại không được định nghĩa.
Giữ cho các bài kiểm tra trích xuất độc lập với các bài kiểm tra mạng. Một mẫu HTML nhỏ đã lưu có thể xác lập rằng một bộ chọn đọc tiêu đề dự kiến và xử lý một liên kết bị thiếu. Một kiểm tra trực tiếp riêng biệt có thể xác lập rằng trang hiện tại được trả về vẫn chứa phần tử bản ghi mong đợi. Những bài kiểm tra này trả lời các câu hỏi khác nhau, vì vậy việc vượt qua một không nên được báo cáo như là bằng chứng cho rằng con đường khác hoạt động. Khi một trang trực tiếp thay đổi, so sánh đánh dấu mới của nó với mẫu đã lưu trước khi thay đổi quy tắc lưu trữ ứng dụng.
Kết luận
Phân tích HTML trong Python là một chuỗi việc thu mua, xây dựng cây, lựa chọn có phạm vi, chuẩn hóa và xác minh. Bộ phân tích không thể sửa chữa một trang sai hoặc thực hiện JavaScript bị thiếu. Chứng minh rằng bạn có đại diện đúng trước, sau đó làm cho mỗi bộ chọn có trách nhiệm với một kiểm tra cấp bản ghi.
Xây dựng một Luồng Trích xuất HTML Python
Truy xuất một trang công cộng được phép, xác nhận danh tính của nó, và phân tích HTML đã trả về với các bộ chọn rõ ràng.
Đăng ký ngay hôm nay và nhận $5 tín dụng miễn phí — không yêu cầu thẻ tín dụng.
Nhận Tín Dụng $5 của Bạn →Câu hỏi thường gặp
BeautifulSoup có tải xuống một trang web không?
Không. BeautifulSoup phân tích đánh dấu mà một thành phần khác cung cấp. Một khách hàng HTTP, tệp cục bộ hoặc dịch vụ hiển thị phải cung cấp HTML trước. Xác minh rằng đại diện đó trước khi tạo cây phân tích.
Bộ phân tích nào tôi nên chuyển cho BeautifulSoup?
Chọn một bộ phân tích một cách có chủ ý và kiểm tra nó với đánh dấu đại diện. Bộ phân tích html.parser tích hợp sẵn của Python có sẵn mà không cần gói bộ phân tích khác, trong khi các backend thay thế có thể diễn giải HTML bị lỗi khác nhau. Ghim backend khiến hành vi của bộ chọn dễ tái tạo hơn.
Python có thể phân tích một trang đã được hiển thị bằng JavaScript mà không cần trình duyệt không?
Python có thể phân tích HTML cuối cùng nếu một thành phần khác đã hiển thị nó, nhưng một yêu cầu HTTP đơn giản và một bộ phân tích HTML không thực hiện JavaScript của trình duyệt. Kiểm tra xem mục tiêu có tồn tại trong HTML ban đầu hoặc phản hồi có cấu trúc được phép trước khi sử dụng hiển thị của trình duyệt.
Các trường bị thiếu nên được xử lý như thế nào?
Xác định các trường nào là bắt buộc và các trường nào là tùy chọn. Từ chối hoặc đánh dấu các bản ghi thiếu các giá trị bắt buộc, và thể hiện sự vắng mặt tùy chọn một cách rõ ràng. Đừng gộp danh sách tiêu đề và giá cả được chọn độc lập, vì một giá cả bị thiếu có thể làm sai lệch mọi bản ghi tiếp theo.
Việc khai thác một trang công khai có luôn được phép không?
Tính công khai không giải quyết quyền cho phép, quyền riêng tư, bản quyền hoặc điều khoản trang web. Xem xét các quy tắc áp dụng và chỉ thu thập những gì dự án của bạn được phép sử dụng. Giữ khối lượng yêu cầu hạn chế và chỉ giữ lại dữ liệu cần thiết cho mục đích đã nêu.