1. Trích xuất dữ liệu từ bảng
Có gì giống nhau giữa bảng và củ hành? Đúng rồi, các lớp!
Các bảng trong HTML giống như một chiếc bánh nhiều lớp, bao gồm các phần tử <table>, <tr> (hàng), <th> (ô tiêu đề) và <td> (ô thông thường). Mỗi phần tử này đóng một vai trò quan trọng trong việc trình bày dữ liệu, và để lấy thông tin từ chúng, chúng ta cần đi qua từng lớp một cách tuần tự.
Thực hành, thực hành và lại thực hành!
Hãy bắt đầu với bảng HTML đơn giản sau:
<table>
<tr>
<th>Tên</th>
<th>Tuổi</th>
<th>Thành phố</th>
</tr>
<tr>
<td>Alice</td>
<td>29</td>
<td>Moscow</td>
</tr>
<tr>
<td>Bob</td>
<td>34</td>
<td>Saint Petersburg</td>
</tr>
</table>
Bước 1: Tìm bảng trên trang
Bảng trên các trang web được định nghĩa bởi các thẻ HTML <table>, và dữ liệu bên trong bảng được đặt trong các thẻ <tr> (hàng của bảng) và <td> (ô dữ liệu). Trong BeautifulSoup, phương thức find sẽ giúp chúng ta tìm bảng đầu tiên trên trang, còn find_all — lấy tất cả các bảng nếu trang có nhiều hơn một bảng.
# Tìm bảng đầu tiên trên trang
table = soup.find("table")
Nếu cần trích xuất một bảng cụ thể, ta có thể tìm chính xác hơn bằng cách chỉ định các thuộc tính bàn như id hoặc class.
# Tìm bảng theo class
table = soup.find("table", {"class": "table-class"})
Bước 2: Trích xuất dữ liệu từ bảng
Sau khi tải bảng lên, ta có thể bắt đầu việc trích xuất dữ liệu. Dữ liệu trong bảng được sắp xếp theo hàng, vì vậy bước hợp lý là duyệt qua các hàng và trích xuất dữ liệu từ từng ô.
Trích xuất tiêu đề
Tiêu đề của bảng thường được đặt ở dòng đầu tiên và nằm trong thẻ <th>. Sử dụng find_all sẽ thu thập được tất cả tiêu đề vào một danh sách.
# Trích xuất tiêu đề từ dòng đầu tiên của bảng
headers = []
header_row = table.find("tr")
for th in header_row.find_all("th"):
headers.append(th.text.strip())
print("Tiêu đề của bảng:", headers)
Trích xuất các hàng dữ liệu
Để trích xuất tất cả các hàng dữ liệu (thường được đặt trong thẻ <tr>, và mỗi ô trong thẻ <td>), ta sử dụng vòng lặp lồng, lần lượt: đầu tiên tìm tất cả các hàng trong thẻ <tr>, sau đó duyệt qua từng ô trong thẻ <td> trong mỗi hàng.
# Trích xuất tất cả các hàng dữ liệu
data = []
rows = table.find_all("tr")[1:] # Bỏ qua hàng đầu với tiêu đề
for row in rows:
row_data = []
for cell in row.find_all("td"):
row_data.append(cell.text.strip())
data.append(row_data)
print("Dữ liệu bảng:", data)
Mã này duyệt qua các hàng của bảng và trích xuất văn bản từ mỗi ô. Hay không? Tất nhiên rồi, ai chẳng biết rằng không có gì kỳ diệu mà không qua vòng lặp!
2. Làm việc với danh sách
Danh sách — "anh cả" của bảng
Trong cuộc sống chỉ có hai đối tượng vô tận: bảng và danh sách. Danh sách được biểu diễn bởi các thẻ <ul> (danh sách không đánh số) và <ol> (danh sách đánh số), với các phần tử là <li>. Không giống bảng, danh sách đơn giản và tối giản. Điều này làm cho chúng trở thành ứng viên lý tưởng để xử lý dữ liệu nhanh và hiệu quả!
Trích xuất dữ liệu từ danh sách
Hãy nhìn vào ví dụ danh sách HTML:
<ul>
<li>Táo</li>
<li>Chuối</li>
<li>Nho</li>
</ul>
Bây giờ, sử dụng BeautifulSoup quen thuộc của chúng ta để trích xuất dữ liệu:
html = """
<ul>
<li>Táo</li>
<li>Chuối</li>
<li>Nho</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('ul')
items = ul.find_all('li')
for item in items:
print(item.get_text())
Thế là xong! Một cách tiếp cận đơn giản nhưng hiệu quả mà bạn có thể áp dụng cho các cấu trúc phức tạp hơn.
3. Ví dụ trích xuất và xử lý dữ liệu bảng
Để củng cố kiến thức, hãy thử lấy dữ liệu từ một ví dụ tương tự trong thực hành, nhưng với cấu trúc phức tạp hơn:
<table id="courses">
<tr>
<th>Khóa học</th>
<th>Giảng viên</th>
</tr>
<tr>
<td>Python cho mọi người</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Tự động hóa với Python</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
Để trích xuất dữ liệu từ bảng và danh sách, ta có thể tùy chỉnh truy vấn như sau:
html = """
<table id="courses">
<tr>
<th>Khóa học</th>
<th>Giảng viên</th>
</tr>
<tr>
<td>Python cho mọi người</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Tự động hóa với Python</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
# Trích xuất dữ liệu từ bảng
course_table = soup.find('table', id='courses')
course_rows = course_table.find_all('tr')
for row in course_rows:
cells = row.find_all(['th', 'td'])
for cell in cells:
print(cell.get_text())
print("---")
# Trích xuất dữ liệu từ danh sách
tech_list = soup.find('ul', class_='technologies')
tech_items = tech_list.find_all('li')
for item in tech_items:
print(item.get_text())
Script này bao gồm cả hai loại dữ liệu. Lưu ý cách chúng ta sử dụng ID và class để tìm chính xác các phần tử. Trong thực tế, bạn có thể gặp phải các cấu trúc HTML phức tạp hơn, nhưng tuyến đường vẫn giống nhau: bắt đầu với cấp cao nhất, giải mã các phần tử và cuối cùng trích xuất dữ liệu quý giá!
4. Tổng kết và lỗi thường gặp
Làm việc với bảng và danh sách trên các trang web giống như đi vào mê cung. Đôi khi chúng ta có thể gặp phải dữ liệu không hoàn chỉnh, chẳng hạn như các ô trống hoặc phần tử bị thiếu. Trong những trường hợp như vậy, việc kiểm tra dữ liệu đảm bảo rằng chúng chính xác và đầy đủ là rất quan trọng. Các lỗi phổ biến bao gồm cố gắng truy cập vào các phần tử không tồn tại hoặc sử dụng sai selectors. Hãy nhớ rằng HTML không phải lúc nào cũng được tổ chức "sạch sẽ" và cấu trúc như mong muốn, vì vậy luôn cần xử lý ngoại lệ và kiểm tra tính hợp lệ của dữ liệu.
Những trường hợp ứng dụng?
Những kiến thức thu nhận được từ bài giảng này sẽ giúp bạn tự động hóa việc trích xuất và xử lý dữ liệu từ nhiều nguồn trực tuyến. Ví dụ, bạn có thể tự động thu thập dữ liệu từ bảng thị trường chứng khoán, theo dõi giá cả trong các cửa hàng trực tuyến, và thậm chí phân tích dữ liệu từ blogs và trang tin tức thường xuyên. Việc làm chủ kỹ thuật trích xuất dữ liệu từ bảng và danh sách mở ra trước mắt bạn vô số cơ hội để tự động hóa và phân tích dữ liệu.
GO TO FULL VERSION