크롤러를 만들다 보면 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를 넣어주면 해당 태그의 값을 읽어온다.
'소프트웨어 > Python' 카테고리의 다른 글
웹 드라이버 함수로 배치? 클래스로 배치? (0) | 2024.05.15 |
---|---|
PYQT5 스타일시트 적용 (0) | 2024.05.14 |
크롬드라이버 최신버전 다운링크 (0) | 2024.04.10 |
PYQT5 Drag & Drop 기능 (0) | 2024.02.25 |
PYQT5 아이콘 넣기 (0) | 2024.02.25 |
댓글