반응형

BeautifulSoup을 이용해서 html문서를 파싱(분류하고 재구성)한 후에는 각 요소에 접근을 할 수 있습니다. 때로는 하나의 요소를 선택한 후 그 앞에 있는 형제 요소에 접근하고 싶을 경우가 있습니다. 그 때 사용하는 메서드가 previous_sibling입니다. 여기서는 간단히 previous_sibling의 사용법에 대해서 살펴보겠습니다. 

 

 

 

1. HTML문서 문자열로 만들기

 

예제를 간단하게 하기 위해서 html 문서를 문자열로 만들어 사용하겠습니다. 

html_doc = """ 
<html>
    <head>
        <title>
            현명한 들쥐 이야기
        </title>
    </head>
    <body>
        <b></b>
        <p class="title">
            <b>
                현명한 들쥐 이야기
            </b>
        </p>
        <p class="book1">
            엤날 옛척에 세 마리의 쥐가 있었습니다.
            <a class="mouse" href="http://example.com/first" id="link1">
                실리버
            </a>
            ,
            <a class="mouse" href="http://example.com/second" id="link2">
                마리버
            </a>
                그리고
            <a class="mouse" href="http://example.com/third" id="link2">
                토드
            </a>
             -그들은 모두 넓은 들판의 한 구멍에 살고 있었습니다.
        </p>
        <p class="book2">
            <b>
                -끝-
            </b>
        </p>
    </body>
</html>
"""

 

 

2. BeautifulSoup으로 HTML문서 파싱(분류하고 재구성) 하기

 

soup = BeautifulSoup(html_doc,'lxml')
# ※lxml이 설치되어 있지 않은 경우는 #BeautifulSoup(finance_page.content,'html.parser')처럼 
# html.parser를 사용할 수 있습니다

 

 

3. 특정 태그에 접근하기

여기서는 형제 요소에 접근하기 전에 기준이 되는 요소에 접근할 필요가 있습니다. 여기서는 body 태그에 접근합니다.

 

body = soup.body
print(body)

이렇게 하면 아래처럼 body부분이 출력되는 것을 확인할 수 있습니다. 

 

<body>
<b></b>
<p class="title">
<b>
                현명한 들쥐 이야기
            </b>
</p>
...
중략.....
...
<b>
                -끝-
            </b>
</p>
</body>

Process finished with exit code 0

 

 

4. 선택한 태그의 앞에 있는 형제 요소 선택하기 

앞에 있는 형제 요소를 선택하기 위해서는 previous_sibling이라는 메소드를 사용합니다. 그렇다면 body 태그 앞에 있는 태그 head 태그를 선택하기 위해서는 어떻게 해야 할까요? 

 

print(body.previous_sibling.previous_sibling)

 

 

위 코드의 출력 결과를 보면 아래와 같이 head 태그가 출력되는 것을 확인할 수 있습니다.

 

<head>
<title>
            현명한 들쥐 이야기
        </title>
</head>

Process finished with exit code 0

 

그런데 코드를 보면 previous_sibling 메소드가 두 번 이어서 사용되고 있습니다. 왜 두 번 이어서 사용해야 원하는 head태그에 접근할 수 있는 것일까요?

 

print(soup.html.contents)

위 코드의 출력 결과를 확인하면 그 이유를 알 수 있습니다. 

 

['\n', <head>
<title>
            현명한 들쥐 이야기
        </title>
</head>, '\n', <body>
...

중략

...
</body>, '\n']

Process finished with exit code 0

여기서 눈여겨 보아야 할 것은 '\n'의 존재입니다. 그러니까 '\n' previous_sibling 메소드가 두 번 이어서 사용할 필요가 있습니다. 

 

 

5. 형제 요소를 반복문으로 확인하기

앞에 있는 형제 요소를 일일히 확인하는 것은 귀찮은 일입니다. for 반복문을 활용해서 조금 더 쉽게 형제 요소를 파악할 수 있습니다. 

 

for sibling in body.previous_siblings:
    print(sibling.name if sibling  != '\n' else '')

여기서 핵심은 if 조건문을 사용해서 '\n'과 ''를 걸러내었다는 것입니다. 위 코드의 출력 결과를 보면 앞에 head 태그만 있다는 것을 확인할 수 있습니다. 

 

head


Process finished with exit code 0

 

 

같이 보면 좋은 글

next_sibling | 형제 요소 선택하기 | BeautifulSoup

 

스크래핑, 크롤링 관련 글 모음

웹 스크래핑 |웹 크롤링 코스

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기