Nếu bạn nghĩ rằng các trang web chỉ là những hình ảnh đẹp và văn bản, thì tôi có tin cho bạn đây: chúng giống như củ hành tây — nhiều lớp và có thể khiến bạn rơi nước mắt (vì vui sướng, tất nhiên!), khi bạn biết được bao nhiêu dữ liệu có thể được trích xuất từ chúng. Hôm nay chúng ta sẽ tìm hiểu các trang HTML bằng thư viện BeautifulSoup
. Mang theo xẻng ảo của bạn nào — đến lúc đào thôi!
1. Phân tích tài liệu HTML
Trang đơn giản
Hãy cùng phân tích một vài tài liệu HTML đơn giản để hiểu chúng gồm những gì và các thành phần nào có thể quan trọng cho việc trích xuất dữ liệu.
Ví dụ về một trang tin tức:
<html>
<head>
<title>Tin tức</title>
</head>
<body>
<h1>Tin chính của ngày</h1>
<p>Hôm nay có một sự kiện quan trọng đã xảy ra!</p>
</body>
</html>
Trong ví dụ này, h1
chứa tiêu đề bài viết, còn
p
— văn bản chính.
Tác động của cấu trúc HTML đến việc scraping
Trước khi sử dụng BeautifulSoup
, bạn cần hiểu cấu trúc của tài liệu HTML mà bạn muốn phân tích. Điều này giúp xác định những phần nào của trang chứa dữ liệu cần thiết. Ví dụ, nếu bạn đang tìm tiêu đề của trang, hãy chú ý đến <h1>
, còn để trích xuất danh sách, hãy sử dụng <ul>
và <li>
.
Chuẩn bị cho việc scraping
Trước khi bắt đầu trích xuất dữ liệu, hãy xác định các thẻ và thuộc tính quan trọng. Ví dụ, nếu các nhà phát triển web đã đánh dấu dữ liệu trên trang bằng cách sử dụng thuộc tính như class="headline"
cho tiêu đề, điều này sẽ giúp bạn rất nhiều. Sử dụng công cụ dành cho nhà phát triển trong trình duyệt để khám phá cấu trúc HTML. Để làm điều này, nhấp chuột phải vào một phần tử và chọn "Inspect"
(trong Google Chrome).
2. Cài đặt và cấu hình thư viện
Cài đặt BeautifulSoup
và requests
Để làm việc với HTML, chúng ta sẽ sử dụng thư viện BeautifulSoup
. Đồng thời, để tải trang HTML, chúng ta cần requests
. Việc cài đặt rất đơn giản, chỉ cần một vài lệnh trên terminal:
pip install beautifulsoup4 requests
Sử dụng requests và BeautifulSoup
cùng nhau
Requests sẽ giúp chúng ta gửi yêu cầu để tải HTML từ trang web, còn BeautifulSoup
sẽ phân tích trang HTML đó. Hãy xem cách thực hiện:
import requests
from bs4 import BeautifulSoup
# Tải trang
url = 'https://example.com'
response = requests.get(url)
# Phân tích trang bằng BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
# Trích xuất tiêu đề của trang
title = soup.title.text
print('Tiêu đề:', title)
3. Điều hướng và trích xuất dữ liệu bằng thẻ
Các phương pháp điều hướng
Bây giờ khi chúng ta đã có một tài liệu HTML, chúng ta có thể sử dụng BeautifulSoup
để điều hướng qua nó. Phương pháp tuyệt vời .select()
cho phép trích xuất dữ liệu bằng cách sử dụng CSS selectors.
Trích xuất dữ liệu bằng thẻ
BeautifulSoup
cung cấp các phương pháp để tìm thẻ như find
và find_all
. Chúng sẽ giúp bạn tìm ra các phần dữ liệu cần thiết:
# Tìm đoạn văn đầu tiên
paragraph = soup.find('p').text
print('Đoạn văn đầu tiên:', paragraph)
# Tìm tất cả các phần tử danh sách
list_items = soup.find_all('li')
for item in list_items:
print('Phần tử danh sách:', item.text)
Sử dụng thuộc tính để lọc
Đôi khi bạn cần trích xuất các phần tử phù hợp với các điều kiện nhất định, ví dụ như có một thuộc tính class
cụ thể. BeautifulSoup
làm điều này rất dễ:
# Trích xuất phần tử có một class cụ thể
headline = soup.find('h1', class_='main-headline').text
print('Tiêu đề:', headline)
4. Áp dụng CSS selectors
CSS selectors là gì?
CSS selectors là công cụ mạnh mẽ cho lập trình viên Python, cung cấp khả năng trích xuất dữ liệu dựa trên các tiêu chí cụ thể. Chúng có thể được sử dụng để tìm các phần tử có chung phong cách, giúp việc scraping trở nên linh hoạt và chính xác hơn.
Sử dụng selectors trong BeautifulSoup
BeautifulSoup
cho phép sử dụng CSS selectors thông qua phương pháp select
. Ví dụ:
# Chọn tất cả các liên kết
links = soup.select('a')
for link in links:
print('Liên kết:', link['href'])
Bạn thậm chí có thể kết hợp các selectors để lựa chọn chính xác hơn. Ví dụ, soup.select('div.article h2')
sẽ chọn tất cả h2
bên trong div
có class article
.
Ví dụ tìm kiếm với CSS selectors
Áp dụng kiến thức của chúng ta trong thực tế. Chọn tất cả các đoạn văn có class highlight
và in nội dung của chúng:
# Trích xuất tất cả các đoạn văn với class 'highlight'
highlighted_paragraphs = soup.select('p.highlight')
for para in highlighted_paragraphs:
print('Đoạn văn nổi bật:', para.text)
Đến đây tạm thời là hết, đừng quên thực hành kỹ năng scraping của mình trước khi chúng ta gặp lại nhau lần sau. Chúc bạn may mắn trong thế giới hấp dẫn của phân tích!
GO TO FULL VERSION