본문 바로가기
Log/Trouble shoot

Python_불규칙적으로 추가되는 요소 제외 문제, 파이썬 역인덱스로 해결

by RIEM 2023. 3. 29.

오늘의 인사이트

스크래핑 시 도중에 추가되는 태그 블록을 무시하고 싶은 경우, 파이썬 역 인덱스를 사용하면 된다. 추가된 블록이 3번째라면 1, 2는 정상적으로 인덱스를 해주고 4번째 부터는 음수의 인덱스로 하여 앞이 아닌 마지막 요소와의 간격 기준으로 인덱싱을 하면 된다. 이렇게 하면 인덱스를 동적으로 수정해줄 필요없다. 

과정

프로필에 있는 블럭 내 테스트를 모두 긁어오면 아래와 같이 나온다.

(주)비주얼
[인턴] 주얼리 플랫폼 '아몬즈' iOS앱 개발 채용
인턴(전환형)
서울
북마크
입사 지원하기
---------------------
(주)비주얼
[인턴] 주얼리 플랫폼 '아몬즈' 안드로이드 개발 인턴 채용
인턴(전환형)
서울
북마크
입사 지원하기
---------------------

---------------------
STEG
응답률 평균 이상
Java 기반 웹 솔루션(ITSM) 풀 스택 개발자
정규직
서울
북마크
입사 지원하기
---------------------

그런데 프로필마다 텍스트 블럭의 개수가 다르다. 텍스트의 줄  6개 또는 7개. 

STEG의 경우, '응답률 평균 이상'과 같은 데이터가 배열 2번째 엘리먼트로 추가된 상황이다. 만약 7개가 넘으면 2번째 요소는 응답과 관련된 메시지임을 알 수 있으니 이를 제외해주는 방식으로 데이터를 전처리해주면 되겠다.

현재는 \n로 줄바꿈이 포함된 거대한 1줄의 string이기에 \n으로 split해준 뒤 배열의 len을 구하면 될 것 같다.

사실 가끔 0개도 나오는데 이는 sleep으로 해결하거나 len 개수 0일 경우 그냥 무시해버리는 방식으로 넘기면 되겠다.

result len: 6
['(주)비주얼', "[인턴] 주얼리 플랫폼 '아몬즈' iOS앱 개발 채용", '인턴(전환형)', '서울', '북마크', '지원 완료']
---------------------
result len: 6
['(주)비주얼', "[인턴] 주얼리 플랫폼 '아몬즈' 안드로이드 개발 인턴 채용", '인턴(전환형)', '서울', '북마크', '입사 지원하기']
---------------------
result len: 7
['서울프라퍼티인사이트', '응답률 매우 높음', '웹 프론트엔드 개발', '정규직', '서울', '북마크', '입사 지원하기']
---------------------
result len: 7
['STEG', '응답률 평균 이상', 'Java 기반 웹 솔루션(ITSM) 풀 스택 개발자', '정규직', '서울', '북마크', '입사 지원하기']
---------------------
result len: 7
['(주)인프라시스템', '응답률 매우 높음', 'C# 프로그래밍 개발자 (신입)', '정규직', '서울', '북마크', '입사 지원하기']
---------------------
result len: 7
['엑심베이', '응답률 높음', 'Server Developer', '정규직', '서울', '북마크', '입사 지원하기']
---------------------
result len: 7
['(주)잉글리시에그', '응답률 평균 이상', 'PHP 웹 개발자', '정규직', '서울', '북마크', '입사 지원하기']
---------------------
result len: 6
['비바리퍼블리카', '[토스] Frontend Developer (Internal Product)', '정규직', '서울', '북마크', '지원하러 가기']
---------------------

배열 요소 개수 6개 짜리와 7개 짜리를 어떻게 처리할까 고민했다. 요소가 7개일 경우와 6개인 경우를 분기 처리하여, 7개일 경우 2번째 응답률 관련 요소는 무시하고 나머지를 1씩 추가한 인덱스를 적용하는 방식을 처음 생각했다. 그런데 생각해보니 파이썬은 [-1]과 같이 뒤에서 인덱싱이 가능하다는 것이 기억났다.

company_data.append(result[0])
job_title_data.append(result[-5])
job_contract_data.append(result[-4])
location_data.append(result[-3])
application_data.append(result[-1])

2번째를 기준으로 앞의 인덱스는 양의 수로, 뒤의 인덱스들은 음수로 적용하면 상수로 인덱싱을 할 수 있다.

print(len(company_data))
print(len(job_title_data))
print(len(job_contract_data))
print(len(location_data))
print(len(application_data))

56
56
56
56
56

혹시 누락이 있는지 테스트를 해보니 수치는 일단 잘 맞다.

 

댓글