3/24 의외의 상황이 발생하여 수정합니다.
업무를 하다보니, data를 넘겨받을 때 상당히 비합리적인 상황이 발생한다.
예를들어, link를 일일이 확인해서 labeling을 진행해야하는데 html source를 받았다.
업무상 필요없는 tag이기 때문에 날려야한다. 어떻게 했는지 보자.
1. HTML 내 link가 어떤식으로 들어갔는가?
2. 접근 및 추출 코드
하단, 그림을 보면 알 수 있듯이 script tag(java script 코드 삽입을 위한 태그)를 위해서 진행하고, 이미지 파일은 기본적으로 <img src = "URL"> 저장하는것이 일반적이다.


1. HTML 내 link가 어떤식으로 들어갔는가?
2. 접근 및 추출 코드
우선 처음으로 생각한 방법은 정규표현식을 통한 문자 추출이였다.
다만, 덜된 전처리긴 하지만 html을 줬다는 것은 Scraping을 진행했다는 것이고, 마무리가 안된 Scraping을 마저 이어가는것이 보다 흐름적으로 맞다고 생각했다.
코드를 우선적으로 보자.
참고로, 내가 받은 파일 형식은 xlsx였다.
import pandas as pd
import numpy as np
from datetime import datetime
from bs4 import BeautifulSoup
from collections import defaultdict
in_path = 'C:/Users/AA/Downloads/'# file 경로
filename = '파일명.xlsx' # file명
sh_name = '시트명' # sheet명
df = pd.read_excel(in_path+filename,sheet_name=sh_name)
i_num = 0
ddic = defaultdict(str)
for x in df['컬럼명']:
soup = BeautifulSoup(x,'html.parser')
urls = soup.find_all('img') # image Tag를 전부 찾는다.
url_lst=[]
try :
for url in urls:
if url['src'] not in null_lst: # src뒤에 있는 링크를 추출하려면 다음과 같이 진행해야한다.
url_lst.append(url['src'])
except KeyError:
pass
ddic[i_num] = url_lst
i_num+=1
df['urls']=ddic.values()
def segment_url(lst,i):
try:
out = lst[i]
return out
except IndexError:
out = ''
return out
for i in range(max(df['urls'].map(len))):
df[f'url{i+1}'] = df['urls'].map(lambda x:segment_url(x,i))
각 cell 별로 가지고 있는 max개의 url list를 펼쳐서 링크 확인을 하기 위해서 최대 url 보유갯수를 기준으로
컬럼을 생성해서 오른쪽으로 쭉 붙이기로했다.
절차는 다음과 같다.
A. beautifulsoup을 통한 html parsing
B. find_all 함수를 통한 index별 link 모아서 list화(default dict 사용)
C. 기존 Data Frame의 컬럼으로 삽입
수정내용 : Key Error 발생으로 Try Except문을 추가했다. img tag가 없는 경우도 발생하기 때문이다.
추가로, collections의 defaultdict의 가장 큰 장점은, 해당 key가 있는지 없는지에 대한 조건문(if~else)을 쓸 필요 없다는 것이다.
어려운 코드는 하나도 없지만 약간의 설명을 하자면,
segment_url 함수 생성의 이유는, 예를들어 url5라는 컬럼이 만들어지는데, 2번 index에는 url이 2개밖에 없게되면 Index Error가 발생한다.
Try, Except문을 통해서 Error 발생을 막고 각 Row별로 cell값을 채워주기 위해서 가장 하단과 같이 진행했다.
이에 따른 최종 아웃풋은 하단과 같다.

'Data 처리 및 기타 programming > Python' 카테고리의 다른 글
| 빅분기 시험용 족보(?) (0) | 2021.12.03 |
|---|---|
| Class에 대한 고찰 (0) | 2021.08.31 |