[python] #2. BeautifulSoup - 컨텐츠 읽기 기본

exoluse·2021년 10월 9일
0

python - web crawling

목록 보기
3/20

.contents

.contents 는 선택된 soup 의 하위 엘리먼트(내용)을 전부 가져온다. 소스를 한번 쳐 보자.

from bs4 import BeautifulSoup
from bs4 import CData

html = """
<div><p><a href="http://google.com">link</a></p></div>
"""

soup = BeautifulSoup(html, 'html.parser')
divTag = soup.div.contents;
print(divTag)

<!-- div 태그 내부를 표시한다. -->
[<p><a href="http://google.com">link</a></p>]

.string

html 태그를 전부 제거한 문자열만 리턴해준다.

...
...
soup = BeautifulSoup(html, 'html.parser')
divTag = soup.div.string;
print(divTag)

<!-- 결과 : 텍스트만 표시한다. -->
link

.children

  1. 선택된 soup 의 하위 엘리먼트(내용)을 iteratable object 로 리턴한다.
...
...
soup = BeautifulSoup(html, 'html.parser')
divTag = soup.div.string;
print(divTag)

<!-- 결과 : object를 표시한다. -->
<list_iterator object at 0x10f69a230>
  1. 그렇다면 어떻게 컨텐츠를 얻나?
for item in divTag :
    print(item)

<!-- 결과 : 하위 엘리먼트를 표시한다. 여러 자식 노드가 있다면 여러개가 표시될 것이다. -->
<p><a href="http://google.com">link</a></p>

.descendants

하위 엘리먼트를 얻는 개념은 같은데 하위 노드를 계속 파고들어가서 맨 마지막까지 리턴해준다.

아래 코드와 결과를 한번 보도록 하자.

...
...
html = """
<div><p><a href="http://google.com">link</a></p></div>
"""

soup = BeautifulSoup(html, 'html.parser')
divTag = soup.div.descendants

for item in divTag :
    print(item)

<!-- 결과 : 첫 자식 노드인 p 태그부터 최종 문자열인 link 까지 표시되었다. -->
<p><a href="http://google.com">link</a></p>
<a href="http://google.com">link</a>
link

대충 짐작이 되는가? 대부분 크롤링의 목적은 특정 부분의 전체 텍스트일 텐데 태그를 타고타고 들어가지 않고 한방에 갈수 있다는 얘기다.

.strings

soup 의 태그 내부 문자열을 iteratable object 로 리턴해준다. 이것도 뭔 개소린지 설명만 듣고는 몰랐다.

html = """
<div>link1<p><a href="http://google.com">link2</a>link3</p></div>
"""

soup = BeautifulSoup(html, 'html.parser')
divTag = soup.div.strings

for item in divTag :
    print(item)

<!-- 결과 : 전부 다른 태그 안에 있으므로 아래와 같이 표시된다. -->
link1
link2
link3

그렇다면 위치는 다르지만 같은 태그 안에 있다면 어떻게 되나?

html = """
<div>link1<p><a href="http://google.com">link2</a></p>link3</div>
"""

soup = BeautifulSoup(html, 'html.parser')
divTag = soup.div.strings

for item in divTag :
    print(item)

<!-- 결과 : 변화는 없다. 태그가 시작하던 끝나던 태그를 구분자로 놓고 분석하는 것 같다. -->
link1
link2
link3

.stripped_strings

이런 html 을 파싱 해보자.


html = """
<div>
    <p>
        <a href="http://google.com">link</a>
    </p>
</div>
"""

soup = BeautifulSoup(html, 'html.parser')
divTag = soup.div.strings

for item in divTag :
    print(item)


<!-- 결과 : ?? 뭔가 공백이 가득 차있다. -->




link



이렇게 바꿔주면 깔끔하게 공백을 삭제해 준다.

...
...
soup = BeautifulSoup(html, 'html.parser')
divTag = soup.div.stripped_strings

for item in divTag :
    print(item)
    
 <!-- 결과 : 공백 삭제! -->
 link

끝~

0개의 댓글