BeautifulSoup là gì? Giải thích về phân tích HTML Python

BeautifulSoup là gì?

API quét toàn cầu không cần scrap có thể cung cấp HTML đã fetch hoặc đã render cho các quy trình Python sử dụng BeautifulSoup làm lớp phân tích.

Tóm tắt

  • BeautifulSoup là một thư viện phân tích HTML và XML cho Python. Nó biến đánh dấu thành một cây có thể tìm kiếm và cung cấp các phương thức để điều hướng thẻ, thuộc tính, văn bản, cha, và anh chị em.
  • BeautifulSoup không fetch trang hoặc chạy JavaScript. Một client HTTP hoặc dịch vụ render phải cung cấp đánh dấu trước khi BeautifulSoup có thể kiểm tra nó.
  • Phần backend của bộ phân tích thay đổi cây. Bộ phân tích tích hợp sẵn của Python, lxml và html5lib có thể giải thích các tài liệu bị hỏng khác nhau, vì vậy các dự án sản xuất nên chọn một cách rõ ràng.
  • Các bộ chọn CSS và phương pháp tìm kiếm cây phục vụ các truy vấn khác nhau. select ngắn gọn cho các mẫu cấu trúc, trong khi findfind_all hoạt động tốt với các thuộc tính và callable.
  • Một bộ phân tích đáng tin cậy xác thực danh tính trang trước. Một phân tích sạch của trang sai có thể trông như một tập dữ liệu trống thành công.

BeautifulSoup là một bộ phân tích, không phải là một client HTTP

BeautifulSoup là một thư viện Python chuyển đổi HTML hoặc XML thành một cây các đối tượng Python. Một BeautifulSoup đối tượng đại diện cho tài liệu, Tag các đối tượng đại diện cho các phần tử, và các đối tượng chuỗi có thể đi qua đại diện cho văn bản. Mã có thể tìm kiếm cây theo tên thẻ, thuộc tính, mẫu văn bản, bộ chọn CSS, hoặc các mối quan hệ.

Tài liệu chính thức của Beautiful Soup tập trung vào việc phân tích, điều hướng, tìm kiếm, chỉnh sửa, và tuần tự hóa tài liệu. Việc thu thập mạng là ngoài công việc đó. Một cuộc gọi Requests, đọc tệp, phiên trình duyệt, hoặc API render phải trước tiên tạo ra đánh dấu.

Ranh giới này giải thích một lỗi không có kết quả chung. Nếu một trang web hiển thị một danh sách chỉ sau khi JavaScript chạy, một client HTTP có thể nhận được một shell gần như trống rỗng. BeautifulSoup phân tích chính xác shell đó và tìm đúng không có mục danh sách. Bộ phân tích không thất bại; lớp thu thập đã không lấy được trạng thái mà bạn dự định phân tích.

Cách hoạt động của cây phân tích BeautifulSoup

BeautifulSoup yêu cầu một phần backend bộ phân tích để giải thích đánh dấu và sau đó bọc cây kết quả trong một giao diện Python nhất quán. Các thẻ phơi bày tên, thuộc tính, nội dung con, hậu duệ, cha, và điều hướng anh chị em. Các tiện ích văn bản kết hợp các chuỗi dưới một nút, trong khi các phương pháp tìm kiếm đi xuyên cây dưới các bộ lọc xác định.

Đối tượng hoặc phương phápMục đíchSử dụng điển hình
BeautifulSoupGốc tài liệu và điểm vào bộ phân tíchTải đánh dấu với một backend rõ ràng
TagNút phần tửĐọc thuộc tính hoặc tìm kiếm trong một bản ghi
findHậu duệ đầu tiên khớpMột trường yêu cầu hoặc tùy chọn
find_allTất cả hậu duệ khớpThẻ hoặc liên kết lặp lại
selectTruy vấn bộ chọn CSSCác mẫu cấu trúc có phạm vi
get_textVăn bản hậu duệ kết hợpTrích xuất trường có thể đọc

Một truy vấn cây nên bắt đầu ở container bản ghi lặp lại. Khi một thẻ đã được chọn, truy vấn trường nên chạy trên thẻ đó, không phải trên toàn bộ soup. Điều này ngăn cản tiêu đề, giá, hoặc tác giả rộng khắp của trang đầu tiên được sao chép vào từng hàng đầu ra.

Chọn rõ ràng Backend Bộ phân tích

BeautifulSoup hỗ trợ nhiều backend bộ phân tích. html.parser đi kèm với Python và thuận tiện cho các kịch bản có thể di động. lxml là một phụ thuộc riêng với khả năng phân tích HTML và XML nhanh. html5lib theo dõi phân tích HTML5 kiểu trình duyệt rất sát và có thể tạo ra một cây khác với các lựa chọn khác trên đánh dấu hỏng.

Tài liệu html.parser của Python mô tả bộ phân tích thư viện tiêu chuẩn và cách xử lý dựa trên callback của các thẻ bắt đầu, thẻ kết thúc, dữ liệu, bình luận, và khai báo. BeautifulSoup đặt một API cây thân thiện hơn lên bộ phân tích đó.

Đừng dựa vào bất kỳ backend nào mà bạn có thể đã cài đặt. Truyền tên backend vào trong constructor, khóa sự phụ thuộc trong môi trường dự án, và thử nghiệm các trang bị lỗi điển hình.

Phân tích và trích xuất một tài liệu nhỏ

Môi trường cục bộ chứa Python và BeautifulSoup, vì vậy mẫu này có thể được thực thi mà không cần một runtime khác. Nó phân tích một chuỗi HTML được kiểm soát, giới hạn các truy vấn đối với từng bài viết, bảo tồn một giá tùy chọn bị thiếu dưới dạng None, và giải quyết một URL tương đối với vị trí tài liệu.

from urllib.parse import urljoin
from bs4 import BeautifulSoup

html = """
<main>
  <article data-id="a1">
    <h2><a href="/items/a1">Field Notes</a></h2>
    <span class="price">$12.00</span>
  </article>
  <article data-id="a2">
    <h2><a href="/items/a2">Archive Map</a></h2>
  </article>
</main>
"""

soup = BeautifulSoup(html, "html.parser")
records = []

for card in soup.select("article[data-id]"):
    link = card.select_one("h2 > a[href]")
    if link is None:
        raise ValueError("record identity is missing")

    price = card.select_one(".price")
    records.append({
        "id": card["data-id"],
        "title": link.get_text(" ", strip=True),
        "url": urljoin("https://example.com/catalog/", link["href"]),
        "price_text": price.get_text(strip=True) if price else None,
    })

print(records)

Ví dụ giữ lại văn bản giá thô thay vì giả định một bộ phân tích tiền tệ. Việc trích xuất nên mô tả những gì tài liệu chứa; chuẩn hóa nên diễn giải giá trị đó theo quy tắc cụ thể cho nguồn. Các trường danh tính bắt buộc sẽ thất bại một cách rõ ràng, trong khi các trường tùy chọn vẫn giữ nguyên tính cụ thể.

Sử dụng các phương pháp tìm kiếm có mục đích

findfind_all chấp nhận tên thẻ, bộ lọc thuộc tính, biểu thức chính quy, danh sách, và callable. Chúng hữu ích khi quy tắc khớp được diễn đạt một cách tự nhiên trong Python. selectselect_one có tính ngắn gọn khi cấu trúc đã được mô tả tốt bởi một bộ lựa chọn CSS.

Giữ cho độ phức tạp của lựa chọn thấp. Các thuộc tính dữ liệu ổn định, các container ngữ nghĩa, và các mẫu URL bền vững thường có thể sống sót tốt hơn so với các tên lớp được tạo ra hoặc các bộ lựa chọn vị trí. Thử nghiệm truy vấn với một fixture thiếu trường và một fixture sai trang, không chỉ con đường hạnh phúc hiện tại.

  • Sử dụng select_one cho một trường duy nhất. Kiểm tra None trước khi đọc văn bản hoặc thuộc tính.
  • Sử dụng select cho các bản ghi lặp lại. Truy vấn các trường con tương đối với từng nút đã chọn.
  • Sử dụng get_text một cách có chủ đích. Chọn một bộ phân cách và hành vi loại bỏ phù hợp với trường.
  • Kiểm tra thuộc tính thông qua truy cập ánh xạ. Phân biệt thuộc tính thiếu với giá trị thuộc tính rỗng.

Biết những gì BeautifulSoup không thể làm

BeautifulSoup không thực thi kịch bản, nhấp vào các điều khiển, duy trì vòng lặp sự kiện trình duyệt, giải quyết các thách thức truy cập, lên lịch thu thập dữ liệu, hoặc lưu trữ hồ sơ. Nó là một lớp bên trong một pipeline lớn hơn. Một kịch bản nhỏ có thể kết hợp nó với Requests; một framework crawler có thể quản lý hàng đợi và xuất khẩu; một dịch vụ rendering có thể cung cấp HTML sau khi thực hiện kịch bản.

Phạm vi hẹp này là một lợi thế. Các bài kiểm tra phân tích có thể chạy nhanh chóng đối với các fixture, và phương pháp thu thập có thể thay đổi mà không cần viết lại các bộ chọn. Các vấn đề dễ dàng hơn để phân loại: byte sai, danh tính tài liệu không mong đợi, sự khác biệt bộ phân tích, lỗi bộ chọn, lỗi chuẩn hóa, hoặc thất bại lưu trữ.

Xử lý mã hóa, văn bản, và mã HTML bị lỗi

Khi phân tích byte từ một HTTP client, hãy xác nhận mã hóa đã công bố và phát hiện trước khi chuyển đổi sang văn bản. Một giải mã không chính xác có thể giữ nguyên cấu trúc thẻ trong khi làm hỏng tên, ký hiệu tiền tệ, hoặc dấu câu. Giữ lại siêu dữ liệu phản hồi gốc bên cạnh lô khi độ tin cậy văn bản có ý nghĩa.

HTML bị lỗi là điều bình thường. Kiểm tra backend đã chọn với các loại phân tổ bị hỏng và các thẻ bị bỏ qua mà nguồn phát ra. Đừng sử dụng tài liệu đã phân tích như một bộ lọc an ninh chỉ vì cây trông giống như đã chuẩn hóa; việc phân tích và làm sạch là hai công việc riêng biệt với các mô hình đe dọa khác nhau.

Xác nhận trang trước khi chấp nhận các hàng

Một bộ phân tích có thể xây dựng một cây sạch từ một trang lỗi. Các định nghĩa ngữ nghĩa HTTP không định nghĩa loại trạng thái, nhưng vận chuyển thành công không chứng minh danh tính trang. Kiểm tra URL cuối cùng, loại nội dung, một tiêu đề đã biết hoặc liên kết chính thức, và số lượng bản ghi hợp lý trước khi tạo ra đầu ra.

Đối với thu thập dữ liệu trên web công cộng, hãy xác định máy chủ và loại dữ liệu cho phép trước khi thực thi. Xem xét các điều khoản và luật pháp áp dụng, tôn trọng các điều khiển truy cập, và sử dụng Giao thức loại trừ Robots như một đầu vào cho hành vi của crawler.

Kết luận

BeautifulSoup là lớp phân tích và điều hướng của một quy trình scraping Python. Nó biến mã thành một cây có thể tìm kiếm, hỗ trợ cả bộ lựa chọn CSS và bộ lọc do Python điều khiển, và làm cho các tài liệu bị lỗi dễ kiểm tra hơn. Độ tin cậy đến từ việc chọn một bộ phân tích một cách rõ ràng, giới hạn các truy vấn trường cho từng bản ghi, bảo tồn sự vắng mặt, và xác nhận trang trước khi chấp nhận các hàng.

Bài kiểm tra đầu tiên tốt nhất là một tài liệu nhỏ được lưu trữ với một bản ghi hoàn chỉnh và một trường tùy chọn bị thiếu. Nếu fixture đó tạo ra đầu ra theo kiểu mong muốn, hợp đồng bộ phân tích sẽ đủ rõ ràng để kết nối với một lớp thu thập dữ liệu sống và bảo tồn bằng chứng đáng tin cậy qua các thay đổi nguồn sau này.

Sẵn sàng kết hợp BeautifulSoup với HTML đã render?

Sử dụng Scrapeless để thu thập khi một trang cần được render, sau đó giữ BeautifulSoup như một lớp phân tích Python có thể thử nghiệm.

Đăng ký 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.

Yêu cầu tín dụng $5 của bạn →

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

BeautifulSoup có phải là một trình thu thập web không?

BeautifulSoup là một bộ phân tích HTML và XML được sử dụng trong quy trình làm việc thu thập dữ liệu. Nó không lấy URL, không chạy JavaScript, không lên lịch trang, hoặc lưu kết quả tự nó.

Sự khác biệt giữa BeautifulSoup và Requests là gì?

Requests là một khách hàng HTTP thu được phản hồi; BeautifulSoup phân tích cú pháp từ phản hồi đó. Chúng giải quyết các lớp khác nhau và thường được sử dụng cùng nhau.

Bộ phân tích BeautifulSoup nào nên được sử dụng?

Chọn một cách rõ ràng dựa trên triển khai và hành vi tài liệu. Bộ phân tích html.parser tích hợp sẵn là di động, lxml nhanh, và html5lib gần gũi với phân tích cú pháp HTML5 theo kiểu trình duyệt; hãy kiểm tra backend đã chọn với các tệp thử nghiệm.

BeautifulSoup có thể phân tích nội dung được kết xuất bởi JavaScript không?

BeautifulSoup có thể phân tích HTML đã được kết xuất sau khi một công cụ khác tạo ra nó, nhưng BeautifulSoup không thể thực thi JavaScript tự nó.

BeautifulSoup có hỗ trợ XPath không?

API chính của BeautifulSoup là tìm kiếm cây và bộ chọn CSS. Nếu XPath là một yêu cầu trung tâm, hãy sử dụng một thư viện mà cung cấp XPath trực tiếp hoặc truy cập một bộ phân tích cơ sở được thiết kế cho nó.

Tài liệu