CodeGym /Các khóa học /Python SELF VI /Trích xuất dữ liệu từ HTML-tags và thuộc tính

Trích xuất dữ liệu từ HTML-tags và thuộc tính

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

1. Dẫn đường qua cây HTML

Hôm nay tụi mình sẽ bước vào thế giới bí ẩn của cây HTML và học cách lấy thông tin từ các trang web như ninja lập trình thực thụ. Chúng ta sẽ tiếp tục dùng "pháp thuật" thư viện BeautifulSoup để lấy được đúng dữ liệu cần thiết và làm cho các đoạn script vốn đã thông minh của chúng ta thậm chí còn xịn hơn nữa. Thế nên, hãy chuẩn bị bàn phím của bạn đi, mình bắt đầu nào!

Trước khi xài BeautifulSoup, tụi mình cần hiểu rõ cây HTML là gì. Hãy nghĩ nó như một cây gia đình khổng lồ, nơi mỗi tag là một thành viên. Có cha mẹ, con cái, anh chị em. Nhiệm vụ của chúng ta là tìm các "thành viên" cụ thể để lấy ra những "báu vật gia đình" (hay dữ liệu).

Đây là một ví dụ nhỏ về cấu trúc HTML:

HTML

<div class="article">
    <h2 id="title">Tiêu đề</h2>
    <p class="content">Đây là đoạn văn bản bài viết...</p>
    <a href="https://example.com" class="link">Đọc thêm</a>
</div>

Ở đây chúng ta có div, nó là phần tử cha của h2, p, và a. Mỗi cái đều có các thuộc tính và nội dung riêng.

2. Trích xuất dữ liệu theo tags

BeautifulSoup có các phương pháp tiện lợi để dẫn đường qua cây HTML và trích xuất dữ liệu. Bắt đầu với phương pháp cơ bản find(), nó giúp ta tìm phần tử đầu tiên có tag cụ thể. Còn find_all() giống như máy xúc, đào ra tất cả các phần tử có tag đó.

python
                      
                        from bs4 import BeautifulSoup
                
                        html_doc = """<div class="article">
                                        <h2 id="title">Tiêu đề</h2>
                                        <p class="content">Đây là đoạn văn bản bài viết...</p>
                                        <a href="https://example.com" class="link">Đọc thêm</a>
                                     </div>"""
                        
                        soup = BeautifulSoup(html_doc, 'html.parser')
                        
                        # Tìm đoạn văn đầu tiên
                        first_paragraph = soup.find('p')
                        print(first_paragraph.text)  # Kết quả: Đây là đoạn văn bản bài viết...
                        
                        # Tìm tất cả các liên kết
                        all_links = soup.find_all('a')
                        for link in all_links:
                            print(link['href'])  # Kết quả: https://example.com
                      
                    

3. Sử dụng thuộc tính để lọc phần tử

Giờ thì tụi mình đã pro với việc tìm kiếm theo tags rồi, giờ mình sẽ học cách lọc các phần tử dựa trên các thuộc tính như idclass. Những thuộc tính này giống như bookmark trên trang, giúp ta biết ngay cái nào là cái gì.

HTML

<div class="article">
    <h2 id="title">Tiêu đề</h2>
    <p class="content">Đây là đoạn văn bản bài viết...</p>
    <a href="https://example.com" class="link">Đọc thêm</a>
</div>
Python

# Tìm phần tử có id cụ thể
title = soup.find(id="title")
print(title.text)  # Kết quả: Tiêu đề

# Tìm tất cả các phần tử có class "content"
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
    print(p.text)  # Kết quả: Đây là đoạn văn bản bài viết...

Quan trọng! Chúng ta dùng class_ thay vì class để tránh xung đột với từ khóa dành riêng trong Python.

4. Thực hành lấy dữ liệu với điều kiện cụ thể

Giờ tới phần thực hành! Giả sử bạn cần lấy liên kết và tiêu đề từ một HTML chứa nhiều bài viết lặp lại. Đây là ví dụ cùng cách xử lý:

HTML

<div class="articles">
    <div class="article">
        <h2 class="title">Bài viết đầu tiên</h2>
        <a href="https://example.com/1" class="read-more">Đọc thêm</a>
    </div>
    <div class="article">
        <h2 class="title">Bài viết thứ hai</h2>
        <a href="https://example.com/2" class="read-more">Đọc thêm</a>
    </div>
</div>

Và đây là cách tụi mình lấy tiêu đề và liên kết:

Python

html_doc = """<div class="articles">
                <div class="article">
                    <h2 class="title">Bài viết đầu tiên</h2>
                    <a href="https://example.com/1" class="read-more">Đọc thêm</a>
                </div>
                <div class="article">
                    <h2 class="title">Bài viết thứ hai</h2>
                    <a href="https://example.com/2" class="read-more">Đọc thêm</a>
                </div>
              </div>"""

soup = BeautifulSoup(html_doc, 'html.parser')

articles = soup.find_all('div', class_='article')
for article in articles:
    title = article.find('h2', class_='title').text
    link = article.find('a', class_='read-more')['href']
    print(f"Tiêu đề: {title}, Link: {link}")
    
# Kết quả:
# Tiêu đề: Bài viết đầu tiên, Link: https://example.com/1
# Tiêu đề: Bài viết thứ hai, Link: https://example.com/2

5. Những điều cần lưu ý

Giờ khi bạn đã có những kiến thức cơ bản, hãy cùng xem vài lỗi phổ biến. Một trong những lỗi thường gặp là cố truy cập thuộc tính không tồn tại. Python sẽ báo lỗi KeyError. Để tránh điều đó, bạn có thể sử dụng phương pháp .get() để lấy thuộc tính với giá trị mặc định nếu chúng không tồn tại.

Bên cạnh đó, đừng quên rằng HTML có thể có các phần tử lồng nhau và cấu trúc phức tạp. Hãy sử dụng công cụ xem mã nguồn của trình duyệt để chắc rằng bạn hiểu rõ cấu trúc trước khi cố gắng trích xuất dữ liệu bằng BeautifulSoup.

Trạm dừng tiếp theo trong hành trình thú vị này sẽ là áp dụng các CSS-selectors để nhắm mục tiêu chính xác hơn và lấy dữ liệu. Hãy ở lại và cùng tiếp tục khám phá thế giới của BeautifulSoup nhé!

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION