문제 상황
최근 회사에서 HTML 기반 텍스트 편집기를 사용하던 중, 텍스트에 색상을 적용했을 때 발생하는 불필요한 공백 문제를 경험했습니다. 이는 특히 텍스트 편집기의 특정 플러그인(텍스트 color 등)을 사용할 때 두드러졌습니다. 이러한 문제는 일반적으로 HTML 편집기의 내부 구현이나 CSS 스타일링과 관련이 있을 수 있습니다. 그렇기에 저 또한 처음에는 CSS를 통해 이 문제를 해결하려 했으나, 이 방법은 긴 텍스트에서 레이아웃이 깨지는 새로운 문제를 야기했습니다. 이를 통해 문제의 원인이 HTML이나 CSS 자체가 아니라, 원본 텍스트에 삽입된 불필요한 공백에서 비롯되었음을 파악했습니다.
해결 방법을 찾기 위해 다양한 디버깅 과정을 거쳤고, 특히 문자열 인코딩 함수의 사용 방법에 주목했습니다. 해당 함수에서 position argument를 잘못 사용함으로써 예기치 않은 동작이 발생해 버그가 생긴 것을 확인했습니다.
예를들어 다음과 같은 코드였습니다.
try:
return self.soup.encode('utf-8','ignore').decode('utf-8') or ''
except Error:
return self._get_text(self.soup)
예상치 못한 동작의 원인은 encode 함수에 ignore 인자를 잘못 전달한 것이었습니다. encode 함수는 문자열을 지정된 인코딩으로 변환할 때 사용되며, errors 매개변수는 인코딩 과정에서 발생하는 에러를 어떻게 처리할지 결정합니다. 여기서 ignore 옵션을 사용하면 인코딩할 수 없는 문자를 무시하지만, 이 경우 잘못된 위치에 인자를 넣어 문제가 발생했습니다.
(method) def encode(
encoding: str = "utf-8",
indent_level: int | None = None,
formatter: str | Formatter = "minimal",
errors: str = "xmlcharrefreplace"
) -> bytes
위 코드는 beautifulSoup 4.12.2 버전 기준으로 작성되었습니다.
return self.soup.encode('utf-8','ignore').decode('utf-8') or '' 코드에서 두번째 인자값에 위치한 ignore가, errors에 해당하는게 아닌, indent_level에 해당하게 되었고, 그 이후 encode함수 처리과정에서 예기치 않은 동작이 발생해 버그가 발생했습니다.
따라서 encode 함수의 사용 방법을 수정함으로써 문제를 해결할 수 있었습니다. 코드를 self.soup.encode('utf-8', errors='ignore').decode('utf-8')
와 같이 변경한 후, 함수가 정상적으로 작동함을 확인했습니다.
이 사례를 통해 복잡한 웹 개발 환경에서는 작은 코드 변경이 큰 영향을 미칠 수 있음을 다시 한번 깨달았습니다. 또한, 디버깅 과정에서 정확한 문제의 원인을 파악하는 것이 중요함을 알 수 있었습니다.
또한 파이썬을 사용하는 유저라면, positional Argument보다, Keyword Argument사용을 통해 위와 같은 일을 방지하는게 좋을 것 같다고 생각이 들었습니다. 감사합니다
참고 자료
https://m.blog.naver.com/youndok/222299302794
https://beautiful-soup-4.readthedocs.io/en/latest/index.html?highlight=encode#output-encoding
'프로그래밍 > 파이썬' 카테고리의 다른 글
주니어 개발자가 말아주는 간식 구매 요청 자동화 (1) | 2024.01.27 |
---|