Hodustory/프로그래밍&DB

파이썬(Python) 입문 : 크롤링, Beautiful Soup

호두밥 2018. 4. 2. 22:05

BeautifulSoup


BeautifulSoup은 HTML이나 XML에서 데이터를 추출하는 파이썬 라이브러리입니다. 웹문서의 구조를 찾아내는 파서를 이용해 찾고자 하는 데이터의 위치를 찾아 내어 값을 추출합니다. 

우선 beautifulSoup 패키지를 설치한 후, 데이터를 추출하려는 페이지의 url을 입력해줍니다. 

url의 웹문서 전체를 불러와 변수로 담아줍니다. 이때 request 패키지를 설치한 후 content 함수를 이용합니다.


from bs4 import BeautifulSoup
import requests

base_url = 'http://dh.aks.ac.kr/Encyves/wiki/index.php/조선_세종'
con = requests.get(base_url)
soup = BeautifulSoup(con.content, 'lxml')

print(soup)


다음 불러온 페이지에서 관계정보 테이블의 정보만 추출해보겠습니다. 관계정보 테이블의 클래스는 wikitable sortable입니다.

태그 <table>중 클래스가 wikitable인 것만 추출해보겠습니다. 이 때 finde()함수를 사용합니다. find( "태그", {"클래스" : "클래스명"})의 형태로 사용합니다.


infoTable = soup.find("table",{"class":"wikitable sortable"})
print(infoTable)

그럼 이제 infoTable에서 시간정보와 내용이 하나의 행으로 구성된 복합 리스트로 추출해보겠습니다.

우선 값을 담을 복합 리스트인 infoPrint를 선언해줍니다.

infoPrint =[]


html 코드의 구성을 살펴보면, table 태그 안에 여러개의 tr(행)이 있고, 그 안에 여러개의 칸(td)가 있습니다. 이 각 행렬의 값을 반복해서 모두 불러와야 될 경우에는 for구문과 find_all()함수를 씁니다. 그리고 해당 태그와 그 하위 태그에 입력된 모든 텍스트 갑을 가져와야 할 때는 get_text()함수를 사용합니다.


for a in find_all("tr"):
info = a.get_text()

print(info)

우선 같은 tr에 속하는 td의 값을 추출하여 하나의 리스트, infoList 를 만들고, 그 리스트를 하나의 리스트 infoPrint로 묶어냅니다. 

html 문서의 구조를 이용하여 코드를 완성하면 아래와 같습니다.


from bs4 import BeautifulSoup
import requests

base_url = 'http://dh.aks.ac.kr/Encyves/wiki/index.php/조선_세종'
con = requests.get(base_url)
soup = BeautifulSoup(con.content, 'lxml')

infoTable = soup.find("table",{"class":"wikitable sortable"})
infoPrint =[]
for a in infoTable.find_all("tr"):
infolist = []
for b in a.find_all("td"):
info = b.get_text()
infolist.append(info)
infoPrint.append(infolist)
print(infoPrint)

-----------------------------------------




이 외의 다양한 기능 몇가지를 소개합니다.

ex) 태그 a에서 href 속성의 값(하이퍼링크 url) 추출하기.

a.get('href')

ex) title태그의 이름 title 추출하기

soup.title.name # u'title'

ex) title 태그의 문자값 추출하기

soup.title.string
# u'The Dormouse's story'

ex) 특정 태그의 클래스 추출하기

soup.['class']

ex) id가 link인 태그와 값을 추출하기

soup.find(id="link")

ex) 특정 태그의 상위 태그 값 추출하기

soup.TagName.parent

ex) 특정 태그의 상위 태그 여러개를 추출하기

soup.TagName.parents

----------------------

안녕하세요. 호두입니다.

이 외에도 태그 말고도 정규식을 이용하는 방법이 있습니다. 이렇게 하는 방법은 다음번에 소개하겠습니다!





반응형