전 시간에 웹 페이지를 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를 사용할 수 있다는 것이다.
이 까지만 사용해도 매우 유용하게 사용할 수 있지만 다음 장에서 유용하게 사용할 수 있는 메소드와 엘리먼트에 대해서 소개하도록 하겠다.
'Programming > Python-Crawling And Scraping' 카테고리의 다른 글
[Python][Crawling][Scraping]Scraping시에 error 핸들링하기(4) (0) | 2019.05.11 |
---|---|
[Python][Crawling][Scraping]BeautifulSoup과 파서로 엘리먼트 선택하기(3) (0) | 2019.05.11 |
[Python][Crawling][Scraping]크롤링과 스크래핑, 그리고 원리(1) (0) | 2019.04.21 |