2018. 1. 16. 22:22ㆍPython/Programming
BeautifulSoup ( https://www.crummy.com/software/BeautifulSoup/bs4/doc/ )
BeautifulSoup 다운로드 ( window )
[ HTML문서 ] - 예제에서 사용할 문서
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <html> <head> <title>The Dormouse's story</title> </head> <body> <p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> </body> </html> | cs |
[ Python ] - 기본적인 BeautifulSoup사용 방법
1 2 3 4 5 6 7 8 9 10 | from bs4 import BeautifulSoup import urllib.request url = "https://www.naver.com" req = urllib.request.Request(url) sourcecode = urllib.request.urlopen(req).read() soup = BeautifulSoup(sourcecode,'html.parser') | cs |
해당코드는 네이버 홈페이지에 요청한 내용을 변수 soup에 BeautifulSoup object 저장
[ 예제 ]
예제에서는 위의 HTML문서를 soup변수에 BeatifulSoup object 저장
BeautifulSoup 는 html문서내의 원하는 태그들을 찾을 수 있도록 다양한 메서드들을 제공하고 있다
[1] Tag관련 메서드
1> Tag Name
tag.name : 해당 태그의 이름을 가져온다
>>> a = soup.find("a")
>>> a
<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
>>> a.name
'a'
2> Tag Attributes
tag.attrs : 해당 태그의 모든 속성들을 가져온다
tag['attribute'] : 해당 태그의 특정 속성값을 가져온다
>>> a.attrs
{'href': 'http://example.com/elsie', 'class': 'sister class2', 'id': 'link1'}
>>> a['class']
['sister']
>>> a['id']
'link1'
>>> a['href']
'http://example.com/elsie'
>>> a['class']="sister class2" # class 속성 추가
>>> a['class'] # 속성이 여러개 있어도 다룰 수 있다
'sister class2'
>>> del a['class'] # 해당 속성값을 삭제할 수 도 있다
>>> a.attrs
{'href': 'http://example.com/elsie', 'id': 'link1'}
[2] Navigating Using Tag Names
1 2 3 4 5 | <html> <head> <title> The Dormouse's story </title> </head> ... </html> | cs |
1> 자손( tag.children or tag.contents )
>>> soup.head
<head><title>The Dormouse's story</title></head>
>>> soup.head.children
<list_iterator object at 0x02D723B0> : list형식으로 결과가 출력된다
>>> list(soup.head.children) : list메서드를 통해서 화면에 출력해보자
[<title>The Dormouse's story</title>]
>>> soup.head.contents
[<title>The Dormouse's story</title>]
자손이란 ? 해당 태그의 바로 하위 태그를 말한다 ( 직계 자손, 아들과 같은 의미 )
head태그의 바로 하위태그인 title 태그가 해당된다
2> 후손( tag.descendants )
>>> soup.head
<head><title>The Dormouse's story</title></head>
>>> soup.head.descendants : list형식으로 결과가 출력된다
<generator object descendants at 0x02D7C690>
>>> list(soup.head.descendants) : list메서드를 통해서 화면에 출력해보자
[<title>The Dormouse's story</title>, "The Dormouse's story"]
후손이란 직계 자손뿐 아니라 해당 자손의 그 자손들을 모두 포함한다 (즉 아들의 아들의 아들 ... 을 모두 포함하는 것 )
head태그의 직계 자손은 title태그이다. 그 title태그의 자손인 "The Dormouse's story"는 head태그의 후손이 된다
3>형제( tag.next_sibling or tag.previous_sibling )
1 2 3 4 5 6 7 8 9 10 11 | <body> <p class="title"> <b>The Dormouse's story</b> </p> <p class="story"> /** 2개의 문자열과 3개의 a태그는 서로 형제관계이다 **/ Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" id="link1">Elsie</a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>; and they lived at the bottom of a well. </p> <p class="story">...</p> </body> | cs |
<body> 의 자손 : <p class="title"></p> & <p class="story"></p> & <p class="story"></p>
<p class="story"> 의 자손 : Once upon ... & <a link1> & <a link2> & <a link3> & and they ...
같은 부모(p class="story")를 가지고 있는 세개의 a태그들과 나머지 문자열을 서로 형제 관계라고 한다
>>> soup.find("a")
<a href="http://example.com/elsie" id="link1">Elsie</a>
>>> soup.find("a").previous_sibling
'Once upon a time there were three little sisters; and their names were\n'
>>> soup.find("a").next_sibling ( a태그 사이에 ,\n이 존재하기 때문에 두번 사용해야한다 )
',\n'
>>> soup.find("a").next_sibling.next_sibling
<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
* 태그에 자손이 하나일 때와 다수일 때의 차이점
.strings() : 해당 태그내의 모든 텍스트들을 가져온다
.string() : 해당 태그의 텍스트를 가져온다
>>> soup.head
<head><title>The Dormouse's story</title></head>
>>> soup.head.string
"The Dormouse's story"
>>> soup.head.title.string
"The Dormouse's story"
자손이 하나일 때 자손과 부모의 같은 텍스트를 가지게 된다
해당 태그의 자손이 다수일 때에는 .string 출력값은 None이 된다
.strings메서드를 통해서 모든 텍스트들을 가져와야한다
>>> list(soup.body.strings)
['\n', "The Dormouse's story", '\n', 'Once upon a time there were three little sisters; and their names were\n', 'Elsie', ',\n', 'Lacie', ' and\n', 'Tillie', ';\nand they lived at the bottom of a well.', '\n', '...', '\n']
다음 포스팅에선 find와 find_all 등의 html문서내의 검색기능에 대해서 알아보도록 하겠습니다
'Python > Programming' 카테고리의 다른 글
BeautifulSoup 예제2 음원사이트 Genie 차트 순위 긁어오기 (0) | 2018.01.24 |
---|---|
Python을 이용한 이미지 다운로드 ( urlretrieve ) (1) | 2018.01.24 |
BeautifulSoup 예제1 네이버 실시간 검색어 긁어오기 (0) | 2018.01.24 |
BeautifulSoup (2) 검색 메서드 (0) | 2018.01.18 |
Python HTTP Request & Response 실습( urllib module ) (0) | 2018.01.16 |