1. Tại sao sử dụng find và find_all?
Hôm nay mình sẽ nói về hai phương pháp chính giúp chúng ta hiệu quả trong việc trích xuất phần tử từ tài liệu HTML: find và find_all.
Trước khi đi vào code, hãy thảo luận một chút về lý do cần những phương pháp này. Hãy tưởng tượng một trang web giống như một thư viện khổng lồ, nơi mỗi từ và câu đều là một phần tử HTML. Tìm đúng thông tin giống như thử đoán vị kem yêu thích mà không biết màu của nó. Phương pháp find và find_all là công cụ "tìm vị kem" giúp bạn tập trung vào đúng thông tin cần thiết.
find: Phương pháp này giống như thói quen của lập trình viên tìm ly cà phê đầu tiên vào buổi sáng - nó nhanh chóng trả về phần tử đầu tiên phù hợp với tiêu chí.find_all: Đây là cách tiếp cận kiên nhẫn hơn, trả về danh sách tất cả các phần tử phù hợp với tiêu chí. Phù hợp khi bạn cần nhiều thông tin (ví dụ như uống nhiều cốc cà phê trong ngày).
2. Sử dụng find
Phương pháp find được sử dụng khi bạn cần nhanh chóng lấy ra phần tử phù hợp đầu tiên. Nó nhận các tham số khác nhau như tên thẻ, thuộc tính và thậm chí cả hàm.
Chữ ký phương pháp find
find(name=None, attrs={}, recursive=True, string=None, **kwargs)
Các tham số của phương pháp find
- name: Tên của thẻ mà bạn muốn tìm. Đây có thể là bất kỳ thẻ HTML nào, ví dụ như
div,p,h1,a, v.v. - attrs: Từ điển các thuộc tính của thẻ. Ví dụ,
{'class': 'example'}hoặc{'id': 'main'}. Tham số này giúp thu hẹp phạm vi tìm kiếm. - recursive: Tham số boolean, xác định xem phương pháp có tìm kiếm thẻ ở tất cả các cấp độ lồng nhau hay không. Mặc định là
True, tức là tìm kiếm ở mọi cấp độ. - string: Tìm kiếm các phần tử chứa văn bản cụ thể. Rất hữu ích để lọc các phần tử theo nội dung văn bản.
- kwargs: Các đối số bổ sung để tìm kiếm theo thuộc tính. Nếu bạn chỉ định các đối số như
class_, chúng sẽ được hiểu nhưattrs={'class': 'value'}.
Ví dụ
from bs4 import BeautifulSoup
html_doc = """
<html>
<head><title>Câu chuyện của Dormouse</title></head>
<body>
<p class="title"><b>Câu chuyện của Dormouse</b></p>
<p class="story">Ngày xửa ngày xưa có ba chị em nhỏ và tên của họ là
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> và
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
họ sống dưới đáy một cái giếng.</p>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
first_link = soup.find('a') # Tìm thẻ <a> đầu tiên
print(first_link) # In: <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
Như bạn thấy, phương pháp find tìm thấy thẻ <a> đầu tiên trong tài liệu, và chúng ta có thể tiếp tục tìm kiếm một cách tự tin với thông tin đã có.
3. Sử dụng find_all
Phương pháp find_all trả về danh sách tất cả các phần tử phù hợp với tiêu chí. Điều này đặc biệt hữu ích khi bạn cần lấy tất cả các thẻ của một loại hoặc tất cả các phần tử có một thuộc tính cụ thể.
Chữ ký phương pháp find_all
find_all(name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)
Các tham số của phương pháp find_all
- name: Tên của thẻ mà bạn muốn tìm. Đây có thể là chuỗi chứa tên thẻ (
div,a,p, v.v.) hoặc danh sách các thẻ, ví dụ["div", "p"]. - attrs: Từ điển thuộc tính để lọc thẻ, ví dụ
{'class': 'example'}. - recursive: Xác định xem có tìm kiếm đệ quy bao gồm các thẻ lồng hay không. Mặc định là
True. - string: Tìm thẻ chứa văn bản cụ thể.
- limit: Giới hạn số lượng kết quả trả về tối đa. Nếu được chỉ định, phương pháp sẽ trả về không quá
limitphần tử. - kwargs: Các tham số bổ sung để lọc thuộc tính thẻ.
Ví dụ sử dụng find_all
Nếu find giống như việc tìm một cuốn sách cần thiết trên kệ sách, thì find_all là phương pháp kỹ lưỡng hơn, như khi bạn đọc từng tiêu đề để hiểu rõ hơn.
all_links = soup.find_all('a') # Tìm tất cả các thẻ <a>
for link in all_links:
print(link.get('href')) # In các liên kết: http://example.com/elsie, http://example.com/lacie, http://example.com/tillie
Trong ví dụ này, chúng ta tìm tất cả thẻ <a> và sau đó trích xuất liên kết từ mỗi thẻ. Điều này rất hữu ích nếu bạn cần thu thập mọi liên kết trên trang.
Lưu ý! Phương pháp find() và find_all() không chỉ có thể được gọi từ đối tượng soup, mà còn từ bất kỳ phần tử con nào do các hàm find(), select(), v.v. trả về.
4. Sử dụng thuộc tính để lọc phần tử
Bây giờ, khi bạn đã biết cách trích xuất dữ liệu, hãy thử cụ thể hơn. Phương pháp find và find_all cho phép lọc phần tử theo thuộc tính. Điều này khá giống việc điều chỉnh bộ lọc trên máy pha cà phê để có đúng loại cà phê mà bạn thích.
GO TO FULL VERSION