CodeGym /Các khóa học /Python SELF VI /Tìm kiếm các phần tử sử dụng phương pháp find và find_all...

Tìm kiếm các phần tử sử dụng phương pháp find và find_all để web scraping hiệu quả hơn

Python SELF VI
Mức độ , Bài học
Có sẵn

1. Tại sao sử dụng findfind_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: findfind_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 findfind_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ụ

Python

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á limit phầ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.

Python

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()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 findfind_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.

1
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Tìm kiếm cơ bản phần tử bằng cách sử dụng `find`
Tìm kiếm cơ bản phần tử bằng cách sử dụng `find`
2
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Trích xuất tất cả các liên kết bằng cách sử dụng `find_all`
Trích xuất tất cả các liên kết bằng cách sử dụng `find_all`
3
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Trích xuất bảng dữ liệu
Trích xuất bảng dữ liệu
4
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Trích xuất tiêu đề và liên kết cụ thể
Trích xuất tiêu đề và liên kết cụ thể
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION