파이썬 웹 크롤링 라이브러리 (BeautifulSoup) find_all() 사용시 주의점

진도리·2021년 11월 30일
0

Python

목록 보기
1/1

Title

영화 추천 시스템을 개발하는데 파이썬 웹 크롤링 라이브러리로 bs4에 내장된 BeautifulSoup()를 사용하다가 알게 된 find_all() 사용시 주의 점 !!

사실... 다른 라이브러리의 find_all()에 대해 알고 있다면 쉽게 생각해 낼 수 있는 주의 점이지만...

Todo

아래 사진에서 보이는 '네이버영화'에서 제공하는 줄거리 부분을 파이썬 웹 크롤링을 통해 데이터를 받아오려고 했다!

code

'네이버영화'의 줄거리부분을 크롤링 하기위해 사용한 코드는 아래와 같다.

위 try문에 있는 print() 결과 ↓

여기서 💣문제발생!!💣

첫번째 라인은 soup.find_all('p', 'con_tx')의 결과이고, 두번째 라인은 soup.select_one('p.con_tx')의 결과다.

find_all()의 결과는 내가 의도했던 바와 다르게 tag_type은 'p'이고, class_name은 'con_tx'와 일치하는 것이 아닌 tag_type은 'p'이면서 class_name에 'con_tx'가 담긴 모든 태그정보를 가져오는 것이었다.

그래서 함께 출력된 [p class="con_tx no_bt"] 가 뭔데...?

페이지 소스를 재차 확인해보니...

위처럼 줄거리와 함께 제작노트(class_name : 'con_tx no_bt')에 해당하는 부분까지 가져왔다.

따라서 find_all() 대신 같은 bs4 라이브러리에서 태그 & 클래스네임과 일치하는 첫 아이템을 반환하는 select_one()으로 대체해서 사용해서 문제를 해결할 수 있었다.

결론

페이지 소스에는 여러가지의 태그 및 클래스들이 있기에 find_all()을 사용해서 특정한 class_name을 가져올때 다른 클래스 class_name 일부에 해당 내용이 있는지 먼저 페이지 소스에서 확인 후 find_all()을 사용할지 select_one()을 사용할지 또는 그 외 내장함수를 사용할지 결정하는 것이 좋을 듯하다.

profile
매일 작은 보폭이라도 앞으로.

0개의 댓글