Chào mọi người, dạo này mình có làm việc nhiều với dữ liệu trên các trang web và nhận thấy việc copy-paste thủ công rất tốn thời gian. Vì vậy, mình đã tìm hiểu và áp dụng Python để tự động hóa việc này. Hôm nay mình muốn chia sẻ lại với mọi người cách mình đã làm, hy vọng sẽ giúp ích cho các bạn.
Chúng ta sẽ sử dụng thư viện BeautifulSoup và requests để lấy dữ liệu HTML từ một trang web, sau đó trích xuất các bảng hoặc thông tin cần thiết và lưu vào file Excel.
Các bước thực hiện:
- Cài đặt thư viện: Nếu chưa có, bạn cần cài đặt
BeautifulSoupvàpandas(để làm việc với Excel). Mở Command Prompt hoặc Terminal và gõ:pip install beautifulsoup4 pandas openpyxl requests
- Lấy nội dung HTML: Sử dụng thư viện
requestsđể tải về nội dung của trang web. - Phân tích HTML: Dùng
BeautifulSoupđể phân tích cấu trúc HTML, tìm đến các thẻ chứa dữ liệu bạn cần (ví dụ: thẻ<table>). - Trích xuất dữ liệu: Lấy nội dung từ các thẻ đã tìm được.
- Lưu vào Excel: Dùng
pandasđể tạo DataFrame từ dữ liệu đã trích xuất và lưu vào file.xlsx.
Ví dụ đơn giản:
Giả sử chúng ta muốn lấy bảng số liệu từ một trang web có cấu trúc HTML như sau:
<table id="data-table">
<thead>
<tr>
<th>Tên</th>
<th>Tuổi</th>
</tr>
</thead>
<tbody>
<tr>
<td>An</td>
<td>25</td>
</tr>
<tr>
<td>Bình</td>
<td>30</td>
</tr>
</tbody>
</table>Đoạn code Python có thể trông như thế này:
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'YOUR_WEBSITE_URL'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.content, 'html.parser')
table = soup.find('table', id='data-table')
if table:
data = []
# Trích xuất header
headers = [th.text.strip() for th in table.find('thead').find_all('th')]
data.append(headers)
# Trích xuất rows
for row in table.find('tbody').find_all('tr'):
cols = [td.text.strip() for td in row.find_all('td')]
data.append(cols)
df = pd.DataFrame(data[1:], columns=data[0])
df.to_excel('output_data.xlsx', index=False)
print("Dữ liệu đã được trích xuất và lưu vào output_data.xlsx")
else:
print("Không tìm thấy bảng dữ liệu.")
else:
print(f"Lỗi khi truy cập trang web: {response.status_code}")Tất nhiên, mỗi trang web có cấu trúc HTML khác nhau nên bạn sẽ cần điều chỉnh cách tìm kiếm các thẻ cho phù hợp. Đây chỉ là một ví dụ cơ bản để các bạn hình dung. Hy vọng bài chia sẻ này hữu ích cho công việc của mọi người!