티스토리 뷰

728x90
반응형

👩‍🎓 학창시절에 썼던 추억의 jupyter notebook으로 BeautifulSoup문서의 예제를 따라 해보겠습니다.

 

Anaconda-Navigator를 열어주세요.

저는 crawling_env 라는 가상환경을 만들고 BeautifulSoup4를 설치했습니다.

이 가상환경을 선택하고 jupyter notebook 의 Launch를 눌러주세요

 

 

 

 

New > Python3를 눌러서 노트북을 만들어주세요 

 

 

 

노트북의 이름을 Beautifulsoup Test라고 정해줬습니다.

 

 

 

 

html 더미데이터를 하나 넣어두고 BeautifulSoup 객체를 만들어주세요

 

 

 

그럼 이제 Beautifulsoup으로 할 수 있는 것들을 살펴보겠습니다.

 

[1] soup.prettify()

 

prettify를 쓰면 이렇게 html 구조를 파악하기 쉽게 바꿔줍니다.

 

 

 

 

 

 

이제부터는 Beautifulsoup의 찐 기능(?)인 html에서 원하는 데이터를 뽑아내는 것을 살펴보겠습니다. 

** 주피터 노트북에서는 print를 안써도 되서 이제부터는 안쓰겠습니다 **

 

[2] soup.태그이름 

 

특정 태그안에 있는 데이터들을 뽑아내 줍니다. 

 

 

 

[3] soup.태그이름.name과 soup.태그이름.string

 

soup.태그이름.name은 특정 태그의 이름을 알려주고 

soup.태그이름.string은 특정 태그로 감싸져있는 string을 뽑아서 알려줍니다.

 

 

 

 

 

 

[4] soup.태그이름.parent과 soup.태그이름.parent.name 

 

soup.태그이름.parent은 특정 태그의 부모 태그의 내용을 알려줍니다.

soup.태그이름.parent.name은 특정 태그의 부모 태그 이름을 알려줍니다. 

 

 

 

참고로 부모태그가 없는 html은 document가 부모이름이라고 나오네요(??) 

 

 

[5] soup.태그이름['class']

 

특정 태그의 class가 뭐라고 설정되어있는 지 알 수 있습니다.

 

 

[6] soup.find('태그이름') 또는 soup.select_one('태그이름')

 

태그 이름에 해당하는 첫번째 태그를 뽑아줍니다.

 

 

 

[7] soup.find_all('태그이름') 또는 soup.select('태그이름')

 

태그이름에 해당하는 모든 태그들을 뽑아내줍니다. 

 

 

 

 

* find와 select의 차이

find는 html tag를 통한 크롤링 / select는 css를 통한 크롤링에 쓰인다고 합니다.

 

첫번째 태그를 찾는 것은 find, select_one 함수이고

모든 태그를 찾는 것은 find_all, select 함수입니다.

 

가장 큰 차이점은 select는 > 로 하위태그를 쉽게 찾을 수 있다는 점입니다.

예를 들어 head 태그 아래있는 title태그를 찾고 싶다고 할때, select가 더 직관적인 형태로 태그를 쫓을 수 있습니다. 

 

 

여기 블로그를 보면 위의 예제보다 훨씬 더 깊숙히 있는 태그를 찾는 예제가 나오는데, select가 더 직관적이게 느껴집니다. 

https://desarraigado.tistory.com/14

 

[8] soup.get_text()

 

html에서 텍스트만 뽑아낼 수 있습니다.

 

 

[9] 클래스 이름으로 element 찾기

 

https://stackoverflow.com/questions/5041008/how-to-find-elements-by-class

 

How to find elements by class

I'm having trouble parsing HTML elements with "class" attribute using Beautifulsoup. The code looks like this soup = BeautifulSoup(sdata) mydivs = soup.findAll('div') for div in mydivs: if (d...

stackoverflow.com

 

 

 

 

 

Beautifulsoup Test.ipynb
0.01MB

반응형
댓글