728x90

전 시간에 웹 페이지를 html 그 자체로 가져오는 방법에 대해서 알아보았다.

하지만 그냥 가져온 html을 어떻게 사용하냐? 그건 매우 고통스러운 일일 것이다.

그래서 데이터를 파싱해주는 파서가 필요하고 그 중하나가 가장 유명한 BeautifulSoup이고 줄여서 bs라 부른다.



BeautifulSoup은 이상한 나라의 앨리스에서 유래된거라고 하는데 자세히는 모른다.

어쨋건 검색하면 위와같은 그림이 꼭 나오게 된다.


find_all - 해당하는 모든 엘리먼트를 찾는다.

select - 해당하는 모든 엘리먼트를 찾는다. css셀렉터 사용가능.


bs를 사용하는 간략한 예시를 보도록 하자.


from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen('http://www.pythonscraping.com/pages/page1.html')
bs = BeautifulSoup(html.read(), 'html.parser')

print('*' * 100)
print(bs.html)
print('*' * 100)
print(bs.h1)
print('*' * 100)
print(bs.body)

위의 페이지를 파싱하는데 엄청 간단해보인다.


print(bs.html)

현재 페이지에서 html을 긁어온다.


print(bs.h1)

그럼 당연히 이 녀석은 현재 페이지에서 h1을 긁어올 것이다.

단 복수개라면 한개만 가져올 것이다. 그래서 복수개를 가져오려면 좀 다르게 써야한다.


print(bs.find_all('h1'))

이런식으로 사용해야만 복수개를 전체적으로 받아올 수 있다.

그래서 실제로는 위와 같이 많이 쓴다.


어쨋든 사용해보면 제대로 값을 파싱하는걸 알 수 있다.


이 때 일종의 체이닝을 타서 값을 가져올 수 도 있다.


print(bs.html.h1)

이렇게 사용하면 html 자식의 태그(직계 자식이 아닐지라도)중에 h1태그를 하나 가져오게된다.


print(bs.html.find_all('h1'))

이렇게 사용하면 html의 자식의 태그 h1태그를 가져온다.

하지만 필자는 find_all보단 select라는 메소드를 추천한다.


print(bs.select('h1'))

이 메소드는 find_all과 유사하지만 더 좋은 효과를 가지고 있는데 바로 css selector를 사용할 수 있다는 것이다.


이 까지만 사용해도 매우 유용하게 사용할 수 있지만 다음 장에서 유용하게 사용할 수 있는 메소드와 엘리먼트에 대해서 소개하도록 하겠다.


+ Recent posts