BeatifulSoup (1) 기본 메서드

2018. 1. 16. 22:22Python/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문서내의 검색기능에 대해서 알아보도록 하겠습니다