BeautifulSoup으로 파싱한 트리문서에서 어떤 특정 요소의 모든 상위 요소를 확인하고 싶다면 어떻게 해야 할까요? 여기서는 parents 메서드의 사용방법을 확인해 보겠습니다.
| 예제를 위한 html 문자열 만들기
parents의 사용 방법 확인에 필요한 간단한 html문서를 문자열로 만들어 보겠습니다.
html_doc = """
<html>
<head>
<title>
현명한 들쥐 이야기
</title>
</head>
<body>
<b></b>
<p class="title">
<b>
현명한 들쥐 이야기
</b>
</p>
<p class="book">
엤날 옛척에 세 마리의 쥐가 있었습니다.
<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="book">
<b>
-끝-
</b>
</p>
</body>
</html>
"""
| BeautifulSoup으로 html 문서 파싱하기
soup = BeautifulSoup(html_doc,'lxml')
#lxml이 설치되어 있지 않은 경우는 html.parser를 사용해도 됩니다.
#BeautifulSoup(html_file,'html.parser')
| <a> 태그 부모(상위) 요소들 모두 가지고 오기
바로 위의 부모 요소만 가지고 오고 싶은 경우는 parent 메서드를 사용합니다.
※자세한 내용이 궁금하신 경우는 아래의 링크를 확인해 주세요.
BeautifulSoup|부모 요소에 접근하기 parent|웹스크래핑
하지만 모든 상위 요소를 가지고 오고 싶은 경우는 parents 메서드를 사용합니다. parents 메서드를 사용하면 모든 상위 요소를 반환받을 수 있습니다. parents 메서드는 generator를 반환합니다.
※generator 가 궁금한 경우 아래 링크를 참조해 주세요.
link = soup.a
for parent in link.parents:
print(parent)
이렇게 출력을 해보면 상위 요소들을 하나씩 다 출력을 해주기 때문에 반복된 내용을 계속 볼 수 있습니다. 내 바로 부모 태그에는 현재의 태그와 형제 태그들이 모두 포함되어 있고 그 상위의 태그에는 또 부모 태그와 부모 태그의 형제 태그, 그리고 현재 태그를 포함한 형제 태그들이 포함되어 있기 때문이죠. 별로 보아도 도움이 안 되는 것 같아서 여기서 결과 부분은 생략하겠습니다.
대신 name 메서드를 이용해서 이름을 출력해 보겠습니다.
link = soup.a
for parent in link.parents:
print(parent.name)
출력된 결과를 보면 모든 상위의 요소들이 반환되었다는 것을 알 수 있습니다.
p
body
html
[document]
참고 문헌
BeautifulSoup Documentation
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.html?highlight=parent#parents
같이 보면 좋은 글들
BeautifulSoup|HTML태그의 자식(children) 요소와 후손(descendants) 요소에 접근하는 방법
BeautifulSoup|부모 요소에 접근하기 parent|웹스크래핑
함께 보면 좋은 글 모음