소프트웨어/Python
find_element 함수 개조
Nerd Dog
2024. 5. 15. 01:52
크롤러를 만들다 보면 find_element 함수를 정말 많이 쓰게 되는데
이게 경우에 따라 원하는 태그에 접근하려면 여러 번 타고 타고 들어가야 하는 경우가 많다 보니
뭔가 범용성이 좋은 함수로 개조하고 싶은 욕구가 느껴지기 마련이다.
그래서 내 경우는 find_element를 find 함수에 넣어서 개조해 사용한다.
개조 find 함수
"""
Parameters:
- element: webdriver 혹은 webelement를 인수로 받는다. 둘 다 find_element를 사용할 수 있다.
- classes: 인수를 여러개 받는다. 타깃이 되는 태그 인자들을 받는다.
- nth: 마지막 인자의 개수가 여러개일 경우 1번 2번 같이 지정이 가능하다.
- add: 마지막 인자에서 개수가 정해지고 또 태그가 있을 경우가 있어 추가된 값
- value: 값을 넣으면 send_keys를 통해 값을 해당 태그를 통해 넣어준다.
- get_value: True면 해당 값을 리턴해준다.
"""
def find_tree(element, *classes, nth = None, add = None ,value = None, get_value = None):
try:
selector = ' '.join(f'.{cls}' for cls in classes)
elements = element.find_elements(By.CSS_SELECTOR, selector)
if nth is not None:
if nth - 1 < len(elements):
element = elements[nth - 1]
else:
raise IndexError(f"No element found at index {nth}")
else:
element = elements[0]
if add:
element = element.find_element(By.CSS_SELECTOR, f".{add}")
if value :
element.send_keys(value)
return True
if get_value:
return element.get_attribute("value")
return element
except Exception as e:
print(f"An error occurred: {e}")
return None
element
element를 받는데 이는 webdriver 혹은 webelement를 받는다.
둘 다 find_element를 사용하기에 범용성이 좋고 webdriver에서 중첩된 태그가 많을 경우 이중 3중으로 더 파고들어서 찾는 태그와 상호작용을 가능케 한다.
*classes
*classes는 들어가야 할 태그가 많을 것을 고려해서 인자를 많이 받을 수 있게 만들었다.
예를 들어 card -> form-group -> form-control 값을 찾아서 값을 넣고 싶다면 이렇게 사용할 수 있다.
find(self.web,'card','form-group','form-control',value=str(point_amount))
nth
마지막으로 사용한 태그가 여러 개일 경우 그리고 각각을 구별하고 싶다면 nth의 개수를 바꾸면 된다.
find(self.web,'form-control',nth=1,value=Id)
find(self.web,'form-control',nth=2,value=Pw)
add
nth 이후에 추가하고 싶은 태그가 하나 있을 경우 사용하면 된다.
nth의 변화가 없다면 그냥 *classes 값에 넣어주면 된다.
find(self.web,'nav-item2',nth=2,add='nav-link').click()
value
값을 넣어주고 싶다면 value를 넣어주면 된다.
find(self.web,'card','form-group','form-control',value=str(point_amount))
get_value
True를 넣어주면 해당 태그의 값을 읽어온다.