반응형

 

BeautifulSoup으로 파싱(분류하고 재구성한) HTML 트리를 다루고 있습니다. 그 트리에서 어떤 특정 요소를 선택하고 때로는 같은 위계에 있는 형제 요소를 선택하고 싶은 경우가 있습니다. 여기서는 어떻게 형제 요소를 선택하는지 확인해 보겠습니다. 

 

 

 

1. html 예제 문서 생성

실제로는 특정 사이트에 request(요청)해서 html 문서를 response(응답)해서 활용하겠지만 여기서는 예제를 간단하게 하기 위해서 문자열로 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를 사용할 수 있습니다.

이제 html문서를 파싱했기 때문에 python 내에서 자유롭게 접근하거나 수정이 가능합니다. 

 

 

3. 특정 태그에 접근하기 

 

형제 요소에 접근하기 전에 먼저 기준이 되는 태그에 접근을 해보겠습니다. 여기서는 p 태그에 접근을 해보겠습니다. 

 

p = soup.body.p
print(p)

이렇게 태그를 통해서 접근을 하면 body 태그의 p 태그 중 첫 번째 p태그에 접근을 할 수 있게 됩니다. 프린트로 출력한 내용을 통해서 첫 번째 p 태그인 것을 확인할 수 있습니다. 

 

<p class="title">
<b>
                현명한 들쥐 이야기
            </b>
</p>

 

 

4. 선택한 태그의 형제 요소 선택하기

 

형제 요소를 선택하기 위해서는 next_sibling이라는 메소드를 사용합니다. 그렇다면  title이라는 class를 가진 p태그의 다음 p태그인 book1이라는 class를 가진 p태그를 선택하기 위해서는 어떻게 해야 할까요? 

 

print(p.next_sibling.next_sibling)

위 내용의 출력 결과를 보면 아래와 같습니다. 

<p class="book1">
            엤날 옛척에 세 마리의 쥐가 있었습니다.
...
(생략)
...
      
</p>

그런데 조금 이상한 부분이 보이지 않나요? p.next_sibling.next_sibling 처럼 next_sibling이라는 메소드가 두 번 이어서 사용되고 있습니다. 

 

그 이유는 p태그의 부모 요소인 body의 내용을 출력해보면 금방 알 수 있습니다. 

 

 

출력 결과입니다. 조금 지저분하게 출력 되어서 보기가 어려우시겠지만 여기서 포인트는 <p class="book1"> 앞에 '\n'이 자리잡고 있다는 것입니다. 

['\n', <b></b>, '\n', <p class="title">
<b>
                현명한 들쥐 이야기
            </b>
</p>, '\n', <p class="book1">
...
(생략)
...
</p>, '\n']

 

조금 더 쉽게 보기 위해서 잘라내어 보면...

 

<p class="title">

            <b>
                현명한 들쥐 이야기
            </b>
</p>, '\n', <p class="book1">

....

 

그러니까 첫 번째 p 태그의 바로 다음 번 요소로는 '\n'처럼 줄바꿈을 의미하는 이스케이프 문자가 있다는 것입니다. 그래서 next_sibling 메서드를 한 번만 사용하면 이 '\n'가 선택됩니다. 그래서 두 번을 연속으로 사용해야 의도했던대로 두 번째 p태그를 선택할 수 있습니다. 

 

 

5. 형제 요소 반복문으로 확인해보기

형제 요소를 일일히 확인하는 것은 귀찮은 일입니다. 여기서는 반복문을 통해서 앞에 있는 형제 요소를 확인해 보겠습니다. 

 

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

여기서 핵심은 if 조건문으로 '\n'를 걸러주었다는 것입니다. 위 코드 결과를 출력해보면 뒤에 p태그가 두 개 있다는 것을 확인할 수 있습니다. 

 

p

p


Process finished with exit code 0

 

 

같이 보면 좋은 글

BeautifulSoup|부모 요소에 접근하기 parent|웹스크래핑

BeautifulSoup| 모든 부모 요소 받아 오기| parents| 웹스크래핑

 

웹스크래핑/웹크롤링 글 모음

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

 

 

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