Cześć, przyszli mistrzowie automatyzacji! Dziś nauczymy się, jak za pomocą Selenium można wyciągać tekst i atrybuty elementów na stronie internetowej. To potężne narzędzie w Twoim arsenale, bo w świecie web-scrapingu najważniejsze to umieć zdobywać informacje. Gotowi wyciągnąć przydatne dane z internetowych głębin? No to zaczynamy!
1. O czym jest ten wykład?
- Podstawy wyciągania danych: Jak wyciągać tekst z elementów HTML, co samo w sobie brzmi jak wyczyn.
- Pobieranie atrybutów: Jak wyciągać takie smaczki, jak linki
(href)i obrazki(src), żeby potem zrobić z nimi coś niesamowitego. - Przykłady z życia: Spróbujemy w praktyce wyciągnąć dane z tabel i list na stronie internetowej. Jak powiedział wielki programista: "Dopóki nie dotkniesz kodu własnymi rękami – nie zrozumiesz do końca".
2. Wyciąganie tekstów z elementów
Załóżmy, że masz piękną stronę internetową z mnóstwem przydatnych informacji. Musisz wziąć tekst z takich elementów jak nagłówki, akapity i inne elementy HTML. Co robić? Tutaj na pomoc przychodzi Selenium.
Przykład
from selenium import webdriver
# Konfigurujemy sterownik dla Chrome
driver = webdriver.Chrome()
# Otwieramy stronę
driver.get("https://example.com")
# Znajdujemy element po klasie i wyciągamy tekst
element = driver.find_element_by_class_name("example-class")
text = element.text
print("Wyciągnięty tekst:", text)
# Nie zapomnij zamknąć przeglądarki
driver.quit()
W tym przypadku używamy metody .text, aby pobrać zawartość tekstową elementu. Łatwiejsze niż nauczenie się wszystkich wyjątków w Pythonie, prawda?
3. Wyciąganie atrybutów z elementów
Tekst – to świetne, ale co, jeśli trzeba dostać coś bardziej specyficznego, np. URL linka lub odnośnik do obrazka? Selenium i tutaj Cię nie zawiedzie.
Przykład
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
# Znajdujemy element po selektorze CSS i wyciągamy atrybut 'href'
link_element = driver.find_element_by_css_selector("a.link-class")
link_href = link_element.get_attribute("href")
print("URL linka:", link_href)
# Znajdujemy element po ID i wyciągamy atrybut 'src'
img_element = driver.find_element_by_id("logo")
img_src = img_element.get_attribute("src")
print("URL obrazka:", img_src)
driver.quit()
Jak widać, wszystko to samo, tylko zamiast .text używamy metody .get_attribute("nazwa_atrybutu"). Proste w nauce metody, ale bardzo potężne w użyciu.
4. Zastosowanie metod w praktyce
Przechodzimy od teorii do praktyki, bo programiści zazwyczaj nie lubią zbyt długo pozostawać w abstrakcji. Zobaczmy przykład, w którym wyciągamy dane z tabeli na stronie internetowej.
Wyciąganie danych z tabel
Załóżmy, że musisz wyciągnąć wszystkie wiersze z tabeli na stronie i wypisać je w konsoli. Oto jak można to zrealizować:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
# Znajdujemy tabelę po ID
table = driver.find_element_by_id("example-table")
# Znajdujemy wszystkie wiersze tabeli
rows = table.find_elements_by_tag_name("tr")
for row in rows:
# Znajdujemy wszystkie komórki w bieżącym wierszu
cells = row.find_elements_by_tag_name("td")
for cell in cells:
print(cell.text, end=' ')
print()
driver.quit()
Najpierw znajdujemy samą tabelę, potem przechodzimy przez wszystkie jej wiersze i komórki, wyciągając i wypisując ich tekst. To jak rozplątywanie skomplikowanej sieci, ale ostatecznie wszystko staje się proste i zrozumiałe!
5. Typowe błędy i jak ich uniknąć
Zanim wyruszymy w kodową przygodę z wyciąganiem danych, porozmawiajmy o typowych błędach, z którymi możesz się spotkać.
Kiedy pracujesz z dynamicznymi stronami, czas może stać się Twoim wrogiem. Jeśli próbujesz pobrać tekst lub atrybut elementu, który jeszcze się nie załadował, dostaniesz błąd NoSuchElementException. To tak, jakby próbować złapać niespodziankę, zanim nadejdzie. Aby tego uniknąć, używaj jawnych oczekiwań (WebDriverWait) zamiast liczyć na cud.
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()
W tym przypadku używamy WebDriverWait i expected_conditions, aby poczekać na załadowanie się elementu. To jak czekanie na pełne przygotowanie potrawy, żeby potem cieszyć się jej smakiem.
GO TO FULL VERSION