인공지능/파이썬

파이썬(Python) - 스크래핑 ① 스크래핑 기초

해피밀세트 2020. 3. 25. 18:47
반응형

 

 

 

스크래핑(scraping)

  • 컴퓨터 프로그램이 다른 프로그램으로부터 들어오는 인간이 읽을 수 있는 출력으로부터 데이터를 추출하는 기법이다.

 

BeautifulSoup

  • 데이터를 추출하는데 필요한 기능이 들어 있는 라이브러리, 파싱(parsing)라이브러리 라고도 한다.
  • 파싱은 받아온 데이터에서 필요한 내용만 추출하는 것을 의미한다.

 

 

from bs4 import BeautifulSoup

 

예제 1)

html = """

<html>

<body>

<h1> 동해물과 백두산이 </h1>

<p> 마르고 닳도록 </p>

<p> 하느님이 보우하사 </p>

<p> 우리나라만세 </p>

</body>

</html>"""

# BeautifulSoup 객체 생성

soup = BeautifulSoup(html, "html.parser")
soup

# BeautifulSoup 객체html -> body -> h1 태그 출력

h1 = soup.html.body.h1 
h1

 

# h1 태그의 문자열만 뽑아내기

h1.string
soup.html.body.h1.string    # 이렇게도 가능

# BeautifulSoup 객체의 html -> body -> p 태그문자열만 출력 (첫번째 문장)

p1 = soup.html.body.p
p1.string

# p1의 다음 문자열 출력

p2 = p1.next_sibling.next_sibling
p2.string

# for문을 사용하여 p태그 문자열 전부 출력하기

for i in soup.find_all('p'):
    print(i.string)

for i in soup.find_all('p'):
    print(i.get_text())

# body태그를 찾아서 뽑아내기

soup.find('body')

# 단일 문장을 뽑는 방법
# body는 여러 문장이기 때문에 출력이 안된다.

soup.find('body').string

오류는 나지 않지만 값이 안나옴

# 여러 문장을 뽑는방법 ①
# get_text()는 단일 문장을 뽑을 땐 사용할 수 없다.

soup.find('body').get_text()

# 여러 문장을 뽑는방법 ①
# 이스케이프 코드를 출력하지 않는다. 

soup.find('body').get_text(strip=True)

# 여러 문장을 뽑는방법 ②

for i in soup.find('body'):
     print(i.string)

# 여러 문장을 뽑는방법 ③

for i in soup.find_all('body'):
     print(i.get_text())

for i in soup.findAll('body'):
    print(i.get_text())

 

 

예제2

html = """

<html>

<body>

<hi id = 'title'> hello </h1>

<p id = 'subtitle'> 안녕하세요 </p>

<p> 인사를 잘하자 </p>

</body>

</html>"""

# id값으로 문자열 뽑기

soup = BeautifulSoup(html, "html.parser")
soup.find(id='title').string

# id값으로 문자열 뽑기

soup = BeautifulSoup(html, "html.parser")
soup.find(id='subtitle').string

 

 

 

예제3

html = """

<html>

<body>

<ul>

<li><a href = "https://www.google.co.kr/"> 구글 </a></li>

<li><a href = "http://truman.tistory.com/"> 해피밀 블로그 </a></li>

</ul>

</body>

</html>"""

# attrs : 속성값 모두 출력

soup = BeautifulSoup(html, "html.parser")
a = soup.html.body.ul.li.a
a.attrs

# 속성값'href' 값 출력

a['href']
a.attrs['href']

# a태그의 'href' 값문장 모두 출력

for i in soup.find_all('a'):
    print(i.attrs['href'])
    print(i.string)

 

반응형