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
스크래핑, 크롤링 관련 글 모음