HTML & CSS

[48-3 Selenium] class 이름이 긴 경우, class 이름에 공백이 있는 경우, find_elements, CSS_SELECTOR, 데이터프레임

Olivia-BlackCherry 2022. 10. 25. 22:02

웹스크래핑 미션

https://www.python.org/ 사이트에서 아래에 해당하는 부분을 스크래핑해보자.

최종 결과는 아래와 같은 모습이다.

{0: {'time': '2022-10-27', 'name': 'Python at Scale'}, 1: {'time': '2022-10-31', 'name': 'Global AI Developer Days - PyLadies Amsterdam'}, 2: {'time': '2022-11-02', 'name': 'NZPUG-Auckland: Crafting Software'}, 3: {'time': '2022-11-03', 'name': 'PyCon PL 2022'}, 4: {'time': '2022-11-03', 'name': 'PyCon Sweden'}}

 

 

웹스크래핑 과정

해당 내용을 스크래핑할 수 있는 고유한 클래스를 찾아낸다.

class ="medium-widget event-widget last"

from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_driver_path = "C:\developer\chromedriver.exe"
driver = webdriver.Chrome(executable_path=chrome_driver_path)
URL = "https://www.python.org"
driver.get(URL)

셀레늄, 웹드라이버 등 기본 설정을 한다.

 

find_elements(By.CSS_SELECTOR, 클래스 등 적기)

find_elements 메소드에서 CSS_SELECTOR를 가지고 

해당 부분을 뽑아낸다. 

 

results = driver.find_elements(By.CSS_SELECTOR, ".medium-widget.event-widget.last .shrubbery .menu li time")

 

그런데

이렇게 클래스가 매우 길고, 여러 개가 이어져 있어 사이사이 공백이 있다. 

이럴 때는, 

클래스 안의 단어 사이를 .(점)으로 연결하되, 원래 띄어쓰기가 되어 있는 부분은 붙여쓴다

"medium-widget event-widget last" >>".medium-widget.event-widget.last

 

날짜와, 내용을 스크래핑한다. 

results = driver.find_elements(By.CSS_SELECTOR, ".medium-widget.event-widget.last .shrubbery .menu li time")
result_list = []
for result in results:
    date =result.get_attribute("datetime")
    date = date.split("T")[0]
    result_list.append(date)
print(result_list)

>>['2022-10-27', '2022-10-31', '2022-11-02', '2022-11-03', '2022-11-03']

 

event_list = []
events = driver.find_elements(By.CSS_SELECTOR, ".medium-widget.event-widget.last .shrubbery .menu li a")
for event in events:
    todo =event.text
    event_list.append(todo)
print(event_list)

>>['Python at Scale', 'Global AI Developer Days - PyLadies Amsterdam', 'NZPUG-Auckland: Crafting Software', 'PyCon PL 2022', 'PyCon Sweden']

 

가져온 데이터를 딕셔너리 형태로 바꾸기

이번에는 이것을 딕셔너리 형태로 나열해보려고 한다. 

두 가지 방법이 있다. 

첫 번째는 판다스 데이터프레임을 이용하여, 

to_dict 메소드에서 키워드 인자로 index를 가져와 데이터를 나열하는 것이다. 

import pandas as pd
pa = pd.DataFrame({"time": result_list, "name": event_list})
print(pa.to_dict(orient="index"))

>>{0: {'time': '2022-10-27', 'name': 'Python at Scale'}, 1: {'time': '2022-10-31', 'name': 'Global AI Developer Days - PyLadies Amsterdam'}, 2: {'time': '2022-11-02', 'name': 'NZPUG-Auckland: Crafting Software'}, 3: {'time': '2022-11-03', 'name': 'PyCon PL 2022'}, 4: {'time': '2022-11-03', 'name': 'PyCon Sweden'}}

 

 

두 번째로는 간단하게 for문을 돌린다.

for n in range(len(events)):
    end_results[n] = {
        "time":results[n].text,
        "name":events[n].text
    }
print(end_results)
driver.quit()

>>{0: {'time': '2022-10-27', 'name': 'Python at Scale'}, 1: {'time': '2022-10-31', 'name': 'Global AI Developer Days - PyLadies Amsterdam'}, 2: {'time': '2022-11-02', 'name': 'NZPUG-Auckland: Crafting Software'}, 3: {'time': '2022-11-03', 'name': 'PyCon PL 2022'}, 4: {'time': '2022-11-03', 'name': 'PyCon Sweden'}}