본문 바로가기

코딩/머신러닝&데이터 분석 강의

[머신러닝 인강] 7-2주차: beautifulsoup 모듈

<7-2주차 수강 클립>

02. 데이터 수집을 위한 Python (Crawling)

07. beautifulsoup 모듈 - 02. id, class 속성을 이용하여 원하는 값 추출하기

08. beautifulsoup 모듈 - 03. CSS를 이용하여 원하는 값 추출하기

09. beautifulsoup 모듈 - 04. 정규표현식을 이용하여 원하는 값 추출하기

 


이번 주차에는 beatifulsoup 모듈의 find, select 함수를 이용해

html 내의 원하는 값을 다양한 방법으로 긁어오는 법을 배웠습니다!

저번 시간에 배웠던 정규표현식을 이용해

특정 패턴에 매칭되는 값만을 긁어올 수도 있다고 하네요!

 

>>수강 인증샷<<

 


 

07. beautifulsoup 모듈 - 02. id, class 속성을 이용하여 원하는 값 추출하기

 

- 다음 뉴스 데이터 추출

뉴스기사에서 제목, 작성자, 작성일 , 댓글 개수 추출

tag를 추출할때는 가장 그 tag를 쉽게 특정할 수 있는 속성을 사용

  • id의 경우 원칙적으로 한 html 문서 내에서 유일
url = 'https://news.v.daum.net/v/20190728165812603'
resp = requests.get(url)

resp.text #응답으로 받아온 html문서가 출력됨

soup = BeautifulSoup(resp.text) #html 문서를 bs객체로 전달해 soup객체 생성
soup #html 문서

 

- id, class 속성으로 tag 찾기

  • 타이틀
  • 작성자, 작성일
title = soup.find('h3', class_='tit_view') #태그명, 속성, ...
title.get_text() # 태그 제외 값만 추출
#전체 문서에서 txt_info 태그의 값들 다 찾기
soup.find_all('span', class_='txt_info')
#작성자, 작성일 따로 찾기
soup.find_all('span', class_='txt_info')[0]
soup.find_all('span', class_='txt_info')[1]
#작성자&작성일 부모 태그로 찾기
info = soup.find('span', class_='info_view') #더 많은 데이터를 담고있는 것 먼저 찾기
info.find('span', class_='txt_info') #범위 좁혀나가기 (작성자가 더 먼저 있어서 결과로 출력)
#전체 본문(p태그) 찾기
container = soup.find('div', id='harmonyContainer')

contents = ''
for p in container.find_all('p'): #p태그를 단 모든 컨텐츠 찾기 (리스트로 반환)
    contents += p.get_text().strip() #각각 태그 사이 value값만 가져와 앞/뒤 잘라서 문자열로 연결
    
contents

 


 

08. beautifulsoup 모듈 - 03. CSS를 이용하여 원하는 값 추출하기

 

- CSS를 이용한 tag 찾기

CSS: html을 꾸밀 때 사용됨 (스타일을 입히고 싶을 때)

CSS 역시 html 문서의 element를 찾아서 해ㅏㅇ 태그에 스타일링을 하는 것

 

select, select_one함수: find함수보다 좀 더 powerful함!

  • select: 만족하는 조건의 모든 elem 찾음
  • select_one: 만족하는 첫 번째 경우만 반환

css selector 사용법:

  • 태그명 찾기 tag
  • 자손 태그 찾기 - 자손 관계 (tag tag)
  • 자식 태그 찾기 - 다이렉트 자식 관계 (tag > tag)
  • 아이디 찾기 #id
  • 클래스 찾기 .class
  • 속성값 찾기 [name='test']
    • 속성값 prefix 찾기 [name ^='test']
    • 속성값 suffix 찾기 [name $='test']
    • 속성값 substring 찾기 [name *='test]
  • n번째 자식(바로 아래 자손) tag 찾기 :nth-child(n)
url = 'https://news.v.daum.net/v/20190728165812603'
resp = requests.get(url)

soup = BeautifulSoup(resp.text)

soup.select('h3')
#id찾기->'#id'
soup.select('#harmonyContainer')

#태그와 id로 찾기->'태그명#id명'
soup.select('div#harmonyContainer')

#id의 '자손' 태그 찾기
soup.select('#harmonyContainer p')

#id의 '자식_바로 아래' 태그 찾기
soup.select('#harmonyContainer > p')
#클래스 찾기->'.클래스명' (리스트로 반환)
soup.select('.tit_view')

#태그와 클래스로 찾기->'태그명.클래스명'
soup.select('h3.tit_view')
#^: 태그 중 해당 속성이 "tx"로 "시작"하는 값들 (prefix)
soup.select('h3[class^="tx"]')

#$: "끝"나는 값들 (suffix)
soup.select('h3[class$="view"]')

#*: "포함"하는 값들 (substring)
soup.select('h3[class*="_"]')
#속성값(id, class 포함)찾기->'태그[속성명=속성값값]'
soup.select('h3[class="tit_view"]')
soup.select('span.txt_info:nth-child(1)') #span태그의 '자식 태그'중 n번째 자식태그 (1부터 시작)
soup.select('span.txt_info:nth-child(2)')

 


 

09. beautifulsoup 모듈 - 04. 정규표현식을 이용하여 원하는 값 추출하기

 

- 정규표현식으로 tag 찾기

값이 필요한 모든 파라미터의 경우 정규표현식 사용 가능

#h관련 태그를 모두 찾고 싶을 때
    #find_all(파라미터는 string)
    #re.compile(파라미터는 raw string)->리턴값은 검출된 결과 string
soup.find_all(re.compile('h\d'))

: find_all 함수: 입력 파라미터는 문자열

: re.compile 함수: 입력 파라미터는 raw string, 리턴 타입은 문자열

 

#특정 확장자명의 파일 찾기_속성 이용
soup.find_all('img', attrs={'src': re.compile('.+\.gif')})

#class로 찾기
soup.find_all('h3', class_=re.compile('.+newsview$'))

 

- 댓글 개수 추출하기

댓글의 경우, 최초 로딩시 전달되는 데이터가 아님

이 경우 추가적인 요청 _AJAX로 비동기적 호출_ 을 하여 따로 데이터를 전송함

개발자 도구의 network 탭에서 확인 (XHR: Xml Http Request)

비동기적 호출: 사이트의 전체가 아닌 일부분만 업데이트 가능하도록 함

#일반적인 방식으로 긁어왔을 때
url = 'https://news.v.daum.net/v/20190728165812603'
resp = requests.get(url)

soup = BeautifulSoup(resp.text)

print(soup.select('span.alex-count-area')[0])
print(soup.select('span.alex-count-area')[0].get_text()) # '0'개로 출력

:  댓글 개수 긁기는 다음 주차에 !

 


 

강의 링크: https://bit.ly/3cB3C8y

반응형