Chào các bậc thầy tự động hóa tương lai! Hôm nay chúng ta sẽ học cách sử dụng Selenium để trích xuất văn bản và các thuộc tính của phần tử trên trang web. Đây là một công cụ mạnh mẽ trong kho vũ khí của bạn, bởi vì trong thế giới web scraping, điều quan trọng nhất là biết cách lấy thông tin. Sẵn sàng để khai thác dữ liệu hữu ích từ internet chưa? Vậy thì bắt đầu thôi!
1. Giới thiệu bài giảng này?
- Cơ bản về trích xuất dữ liệu: Cách lấy văn bản từ các phần tử HTML, điều này nghe thì đơn giản nhưng đầy thách thức.
- Trích xuất thuộc tính: Làm thế nào để lấy những thứ tuyệt vời như link
(href)
và hình ảnh(src)
, để sau đó ta có thể làm điều gì đó thật tuyệt vời với chúng. - Ví dụ thực tế: Thử nghiệm trích xuất dữ liệu từ bảng và danh sách trên một trang web. Như một lập trình viên vĩ đại đã nói: "Nếu bạn chưa thực sự thử code bằng tay, bạn chưa thực sự hiểu nó."
2. Trích xuất văn bản từ phần tử
Hãy tưởng tượng bạn có một trang web đẹp đẽ với rất nhiều thông tin hữu ích. Bạn muốn lấy văn bản từ các phần tử như tiêu đề, đoạn văn và các phần tử HTML khác. Làm sao đây? Selenium chính là cứu cánh.
Ví dụ
from selenium import webdriver
# Cấu hình driver cho Chrome
driver = webdriver.Chrome()
# Mở trang web
driver.get("https://example.com")
# Tìm phần tử bằng class và trích xuất văn bản
element = driver.find_element_by_class_name("example-class")
text = element.text
print("Văn bản đã trích xuất:", text)
# Đừng quên đóng trình duyệt
driver.quit()
Ở đây, ta sử dụng phương pháp .text
để lấy nội dung văn bản từ phần tử. Dễ hơn là học hết các ngoại lệ trong Python, đúng không?
3. Trích xuất thuộc tính từ phần tử
Văn bản thì tuyệt, nhưng nếu cần thứ gì đó cụ thể hơn, ví dụ như URL của một link hay liên kết đến hình ảnh thì sao? Selenium cũng sẽ không làm bạn thất vọng.
Ví dụ
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
# Tìm phần tử bằng CSS selector và trích xuất thuộc tính 'href'
link_element = driver.find_element_by_css_selector("a.link-class")
link_href = link_element.get_attribute("href")
print("URL của link:", link_href)
# Tìm phần tử bằng ID và trích xuất thuộc tính 'src'
img_element = driver.find_element_by_id("logo")
img_src = img_element.get_attribute("src")
print("URL của hình ảnh:", img_src)
driver.quit()
Như bạn thấy, mọi thứ gần như giống với cách trích xuất văn bản, chỉ khác là thay vì .text
, ta dùng phương pháp .get_attribute("tên_thuộc_tính")
. Đơn giản nhưng đầy sức mạnh!
4. Áp dụng phương pháp trong thực tế
Hết lý thuyết rồi, giờ đến thực hành, vì lập trình viên thường không thích lang thang trong khoảng trống trừu tượng quá lâu. Hãy xem một ví dụ về cách trích xuất dữ liệu từ bảng trên trang web.
Trích xuất dữ liệu từ bảng
Giả sử bạn cần lấy tất cả các hàng từ một bảng trên trang web và in chúng ra console. Đây là cách thực hiện:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
# Tìm bảng bằng ID
table = driver.find_element_by_id("example-table")
# Tìm tất cả các hàng trong bảng
rows = table.find_elements_by_tag_name("tr")
for row in rows:
# Tìm tất cả các ô trong hàng hiện tại
cells = row.find_elements_by_tag_name("td")
for cell in cells:
print(cell.text, end=' ')
print()
driver.quit()
Đầu tiên là tìm bảng, sau đó lặp qua tất cả các hàng và ô, trích xuất và in nội dung văn bản của chúng. Nó giống như gỡ một mạng nhện phức tạp, nhưng cuối cùng mọi thứ trở nên đơn giản và dễ hiểu!
5. Lỗi thường gặp và cách tránh
Trước khi chúng ta lao vào cuộc phiêu lưu code để trích xuất dữ liệu, hãy nói về những lỗi phổ biến mà bạn có thể gặp phải.
Khi làm việc với các trang động, thời gian có thể trở thành kẻ thù. Nếu bạn cố lấy văn bản hoặc thuộc tính của phần tử chưa tải xong, bạn sẽ gặp lỗi NoSuchElementException
. Giống như việc cố bắt một bất ngờ trước khi nó đến. Để tránh điều này, hãy sử dụng các phương pháp chờ đợi rõ ràng (WebDriverWait
) thay vì chỉ dựa vào may mắn.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "lazy-class"))
)
print(element.text)
finally:
driver.quit()
Ở đây, chúng ta sử dụng WebDriverWait
và expected_conditions
để chờ đợi phần tử đến. Giống như đợi món ăn chín, và sau đó thưởng thức từng hương vị.
GO TO FULL VERSION