1. Ôn lại CSS-selectors
Chào mừng bạn đến với thế giới, nơi các trang HTML giấu bí mật không phải chỉ qua một cú búng tay, mà là qua một CSS-selector chuẩn. Nếu bạn nghĩ rằng CSS-selectors chỉ dùng để làm đẹp trang (kiểu để website không giống một cuốn sổ nhật ký học sinh), thì đã đến lúc mở con mắt thứ ba của người làm web scraping. Hôm nay chúng ta sẽ khám phá cách CSS-selectors có thể trở thành công cụ yêu thích của bạn trong việc tìm kiếm và trích xuất dữ liệu.
CSS-selectors, như một cách gọi thân thương, cho phép chúng ta gọi tới các phần tử HTML. Chúng giúp xác định phần tử nào trên trang bạn muốn xử lý. Nếu trang HTML là một mê cung, thì CSS-selectors là sợi chỉ đỏ giúp bạn tìm lối ra.
Ví dụ CSS-selectors
- Thẻ:
p— chọn tất cả các phần tử<p>(paragraph). - Lớp:
.classname— chọn tất cả các phần tử với class đã định. - ID:
#idname— chọn phần tử với ID đã định. - Kết hợp:
div > p— chọn tất cả<p>, là con trực tiếp của<div>.
2. Sử dụng selectors trong BeautifulSoup
Tạm biệt cuộc sống nhàm chán khi không dùng CSS-selectors trong BeautifulSoup! Đã đến lúc cải thiện cách tiếp cận. Hãy tưởng tượng rằng bạn bắt gặp một trang web và nhất định phải lấy tất cả những câu danh ngôn nổi tiếng để gây ấn tượng trong một buổi phỏng vấn. Để làm điều đó, chúng ta sử dụng phương thức select(), hoạt động dựa trên CSS-selectors.
Phương thức select() và select_one()
Phương thức select() sẽ trả về danh sách tất cả các phần tử phù hợp với selector của bạn. Còn select_one() sẽ tìm phần tử đầu tiên tương ứng với selector đó — như một công cụ tìm kiếm trả đúng thứ bạn cần mà không làm bạn chìm trong danh sách dài lê thê.
Giả sử bạn có trang HTML chứa các câu danh ngôn:
<div class="quote">
<h2 class="author">Pushkin</h2>
<p class="text">Ay da Pushkin.</p>
<a href="https://example.com" class="link">Đọc tiếp</a>
</div>
<div class="quote">
<h2 class="author">Lenin</h2>
<p class="text">Học, học nữa và học mãi.</p>
<a href="https://example.com" class="link">Đọc tiếp</a>
</div>
<div class="quote">
<h2 class="author">Stalin</h2>
<p class="text">Có người là có vấn đề, không người là không vấn đề.</p>
<a href="https://example.com" class="link">Đọc tiếp</a>
</div>
Đây là cách chúng ta có thể lấy chúng:
from bs4 import BeautifulSoup
import requests
# Lấy mã HTML của trang
response = requests.get('http://quotes.toscrape.com/')
soup = BeautifulSoup(response.text, 'html.parser')
# Tìm tất cả các câu danh ngôn bằng CSS-selectors
quotes = soup.select('.quote')
for quote in quotes:
text = quote.select_one('.text').get_text()
author = quote.select_one('.author').get_text()
print(f'Câu danh ngôn: {text}\\nTác giả: {author}\\n')
Không phải tiện lợi đến mức như phép thuật sao? Class .quote giúp chúng ta lấy tất cả các phần tử được đánh dấu là câu danh ngôn, còn .text và .author là các phần tử con mà chúng ta trích xuất văn bản câu danh ngôn và tác giả.
3. Ví dụ tìm kiếm với CSS-selectors
Thử thực hành trên các ví dụ để não bộ thông minh biết phải làm gì khi gặp div với hàng chục class. Selectors có thể được sử dụng để tìm dữ liệu trên các trang chính xác hơn. Bạn có thể kết hợp chúng để có được đúng thứ mình cần.
Selector theo class và thẻ
# Tìm tất cả các liên kết trong menu
menu_links = soup.select('nav.menu a')
for link in menu_links:
print(link['href'])
Selector theo ID
# Trích xuất tiêu đề chính của trang
main_heading = soup.select_one('#main-heading')
print(main_heading.text)
Kết hợp selectors
# Tìm tất cả các câu trong phần được làm nổi bật
highlighted_sentences = soup.select('.highlighted p')
for sentence in highlighted_sentences:
print(sentence.text)
4. Lỗi và cách tránh
Công việc của bạn với tư cách là người làm web scraping không phải lúc nào cũng đơn giản như uống cốc cà phê. Có những lúc CSS-selectors có thể không hoạt động nếu:
- Trang có nội dung động thay đổi, và các phần tử bạn cần được tải qua JavaScript.
- Bạn tìm tới selector không tồn tại (ví dụ như bạn viết sai class hoặc ID).
- Cấu trúc HTML thay đổi, khiến bạn cảm giác như đang tìm kiếm trong cơn ác mộng.
Để tránh những lỗi này, hãy chắc chắn rằng bạn đang làm việc với phiên bản HTML tĩnh và chính xác nhất, đồng thời kiểm tra độ chính xác khi viết selectors.
Ứng dụng thực tế
Bây giờ bạn đã có thể sử dụng CSS-selectors trong các dự án thực tế về trích xuất dữ liệu. Kỹ năng này sẽ hữu ích trong việc xây dựng công cụ phân tích và giám sát giá cả, lấy tin tức và thậm chí theo dõi thay đổi trên các trang web. Điều đẹp đẽ của phương pháp này là ngay cả khi trang web thay đổi giao diện nhờ CSS, mã của bạn vẫn hoạt động vì nó phụ thuộc vào cấu trúc HTML, không phải vào cách trang trí.
GO TO FULL VERSION