<aside> 💡 해결! 버전 문제 맞음!
</aside>
지식인에서 category별 QA로 접근할 수 있는 링크와 페이지 형식은 고정적이며, 다음과 같은 형태로 접근할 수 있다. 현재 작업하고 있는 category_num은 110304번이다.(중학교육-과학)
<https://kin.naver.com/qna/kinupList.naver?dirId={category_num}&page={page}>
# category_num = 카테고리 고유 넘버
# page = QA 페이지마다 링크가 20개씩 있는데, 1(첫페이지)~n(마지막 페이지)
해당 페이지마다 있는 20개의 링크는 다음과 같이 접근한다.
for id in range(1,21): #id는 20개 중 몇 번째인지
#한 게시판에 게시글이 20개씩있고 이것을 pagenation에 대해서 옮겨가야함
html = response.text
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('tbody', id='au_board_list')
titles = ul.select(f'tr:nth-child({id}) > td.title > a')
category = ul.select(f'#au_board_list > tr:nth-child({id}) > td.field > a')[0].text
이 때 문제가 발생하는 부분은 6번째 line인 titles(제목)를 불러올 때 발생한다. (f'tr:nth-child({id}) > td.title > a') 에 대해 아래와 같은 문제가 발생하는 것.
NotImplementedError: Only the following pseudo-classes are implemented: nth-of-type.
해당 에러에 대해 검색했을 때, 구글 크롬 개발자도구에서 셀렉터 카피에서 나오는 child 선택자인 nth-child 를 지원하지 않는다는 내용이 있어 solution으로 제시된 내용대로 코드를 수정했다.
for id in range(1,21): #id는 20개 중 몇 번째인지
#한 게시판에 게시글이 20개씩있고 이것을 pagenation에 대해서 옮겨가야함
html = response.text
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('tbody', id='au_board_list')
titles = ul.select(f'tr:nth-of-type({id}) > td.title > a')
category = ul.select(f'#au_board_list > tr:nth-of-type({id}) > td.field > a')[0].text
이 때는 하단과 같은 에러를 확인할 수 있었다.
ValueError: nth-of-type pseudo-class value must be at least 1.
아무 값도 도출되지 않는다는 뜻인데, 추출하고자 하는 해당 경로를 selector로 뽑으면 명확한 경로가 나온다.
#au_board_list > tr:nth-child(1) > td.title > a
#au_board_list는 5번째 줄인 soup.find에 저장된 ul이 가지고 있음
해당 코드가 제대로 동작한다는 팀원과 환경값을 비교해봤을 때, 설치되어있는 bs4(BeautifulSoup) 버전이 다르다는 사실을 확인했고 버전을 맞춰보고자 했다.
공식에서 pip update를 통해 버전을 자동으로 업그레이드해주는 기능을 제공하지 않는다고 해서 공식 다운로드 파일 모음집에서 4.11.1에 해당하는 tar 파일을 가져왔다.
그런데 beautifulsoup4 · PyPI 를 확인해보니 pip install beautifulsoup4를 하면 4.11.1이 깔린다는 것.
따라서 팀원에게 bs4 구동과 관련된 모든 환경 정보를 받아둔 상태이다.
#팀원
python 3.8.13
Ubuntu
beautifulsoup4==4.11.1
requests==2.27.1
pandas == 1.4.2
tqdm==4.64.0
#본인
Python 3.8.5
Ubuntu
beautifulsoup4== 4.11.1
requests==2.27.1
pandas == 1.1.4
tqdm==4.41.1
왼쪽 파일 버전으로 setting하고, pip을 upgrade했더니 해결되었다.