嗨,未來的自動化高手們!今天我們要來學學如何透過 Selenium 提取網頁上的文字和元素屬性。這是一個非常強大的工具,畢竟在網頁爬蟲的世界裡,關鍵是學會如何拿到資料。準備好從網路的深淵中挖掘有用的資訊了嗎?那我們開始吧!
1. 這堂課在說些什麼?
- 數據提取的基礎:如何從 HTML 元素中抽取文字,聽起來就像是個壯舉。
- 獲取屬性:如何提取像連結
(href)
和圖片(src)
這樣的好料,然後可以用它們做點驚人的事。 - 實際案例:實踐中如何從網頁上的表格和清單提取數據。就像大師說的:「不動手寫程式碼就不算真正懂了」。
2. 從元素提取文字
假設你有一個超棒的網站,上面有一堆有用資訊。你需要從標題、段落以及其他 HTML 元素中提取文字,該怎麼做?別擔心,Selenium 前來救援。
範例
Python
from selenium import webdriver
# 設定 Chrome 的 driver
driver = webdriver.Chrome()
# 開啟網站
driver.get("https://example.com")
# 通過 class 找到元素並提取文字
element = driver.find_element_by_class_name("example-class")
text = element.text
print("提取的文字:", text)
# 別忘記關閉瀏覽器
driver.quit()
這裡我們使用了 .text
方法來獲取元素的文字內容。比記住 Python 的所有例外還簡單,對吧?
3. 從元素提取屬性
文字內容很棒,但如果你需要更特定的東西,例如連結的 URL 或圖片的 URL,該怎麼辦?Selenium 也能搞定。
範例
Python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
# 通過 CSS 選擇器找到元素並提取 'href' 屬性
link_element = driver.find_element_by_css_selector("a.link-class")
link_href = link_element.get_attribute("href")
print("連結的 URL:", link_href)
# 通過 ID 找到元素並提取 'src' 屬性
img_element = driver.find_element_by_id("logo")
img_src = img_element.get_attribute("src")
print("圖片的 URL:", img_src)
driver.quit()
可以看到,和前面一樣,只是把 .text
換成了 .get_attribute("屬性名稱")
方法。簡單易學,但功能非常強大。
4. 在實際中應用這些方法
從理論跳到實踐,因為程式員通常不喜歡在抽象中停留太久。我們來看一個提取網頁中表格數據的例子。
從表格提取數據
假設你需要提取網站表格中的所有行並在主控台中顯示。這樣實現:
Python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
# 通過 ID 找到表格
table = driver.find_element_by_id("example-table")
# 找到表格中的所有行
rows = table.find_elements_by_tag_name("tr")
for row in rows:
# 找到當前行的所有單元格
cells = row.find_elements_by_tag_name("td")
for cell in cells:
print(cell.text, end=' ')
print()
driver.quit()
首先,我們找到表格,然後遍歷表格中的所有行和單元格,提取並顯示它們的文字內容。這就像解開一個複雜的蜘蛛網,但最終一切都變得簡單易懂!
5. 常見錯誤及如何避免
在我們投入提取數據的程式碼冒險之前,聊聊一些常見的錯誤,以及該如何避免它們。
當你處理動態網頁時,時間可能會成為你的敵人。如果你嘗試獲取尚未加載的元素的文字或屬性,就會遇到 NoSuchElementException
錯誤。這就像在驚喜到來之前試圖抓住它一樣。要避免這個問題,使用顯式等待 (WebDriverWait
),而不是祈禱奇蹟發生。
Python
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()
這裡我們使用了 WebDriverWait
和 expected_conditions
來等待元素加載完成。就像等待一道菜完全準備好再享用它的美味。
GO TO FULL VERSION