[python] #4. BeautifulSoup - 인접 엘리먼트 구하기

.parent, .parents

선택된 soup 의 상위 엘리먼트를 취득한다.

html = "<html><head><title>Nanana</title></head><body><a class='a'>body...</a><a class='b'>body2...</a></body></html>"

soup = BeautifulSoup( html, 'html.parser')

selected = soup.select("a")[0]

print(selected.parent)

<!-- 결과 : 선택된 엘리먼트의 바로 상위 엘리먼트가 표시된다. -->
<body><a class="a">body...</a><a class="b">body2...</a></body>
...
...
...
for item in selected.parents :
    print(item+"\n")
    
<!-- 결과 : 선택된 엘리먼트의 최상위까지 계속 보여준다. 근테 최상위를 두번 보여주네? 왜 그런지 아시는분? -->
<body><a class="a">body...</a><a class="b">body2...</a></body>
<html><head><title>Nanana</title></head><body><a class="a">body...</a><a class="b">body2...</a></body></html>
<html><head><title>Nanana</title></head><body><a class="a">body...</a><a class="b">body2...</a></body></html>

.previous_sibling, next_sibling

  1. 왼쪽, 오른쪽에 있는 엘리먼트를 취득한다. 일단 소스부터 보면서 ㄱㄱㄱ
html = """<html><head><title>Nanana</title></head><body><a class='a'>body...</a><a class='b'>body2...</a></body></html>"""

soup = BeautifulSoup( html, 'html.parser')

selected = soup.select("a")[1]

print(selected.previous_sibling)
print(selected.next_sibling)

<!-- 결과 : 두번째 a 태그의 양 옆을 구한다. 오른쪽은 없고 왼쪽은 있다. -->
<a class="a">body...</a>
None
  1. 근데 문제가 생겼다.
html = """<html><head><title>Nanana</title></head><body>
<a class='a'>body...</a>
<a class='b'>body2...</a>
</body></html>"""

soup = BeautifulSoup( html, 'html.parser')

selected = soup.select("a")[1]

print(selected.previous_sibling)
print(selected.next_sibling)

<!-- 결과 : 아무고또 없다... 아무고또 ㅠㅠ -->
  1. 그래서... 확인해 보았다.
html = """<html><head><title>Nanana</title></head><body>
<a class='a'>body...</a>
<a class='b'>body2...</a>
</body></html>"""

soup = BeautifulSoup( html, 'html.parser')

selected = soup.select("a")[1]

for item in selected.previous_siblings :
    print(item)
    
<!-- 결과 : 개행 문자열 포함 5개가 나왔다. -->


<a class="a">body...</a>

  1. 그 말은 곧 sibling 은 엘리먼트만 횡단하는게 아닌 특정 문자열에도 적용이 되는 것 같다.

.previous_element, next_element

  1. 단순히 봐선 요소를 뽑아낸다는 걸로 보인다. 소스를 보면서 이해해 보자.
html = """<html><head><title>Nanana</title></head><body><a class='a'><span>body...</span></a><a class='b'>body2...</a></body></html>"""

soup = BeautifulSoup( html, 'html.parser')

selected = soup.select("a")[1]

print(selected.next_element)
print(selected.previous_element)

<!-- 결과 : 문자열만 뽑아낸다. -->
body2...
body...

공통 사항

끝에 "s" 가 붙으면 iteratable object 를 반환한다. for나 join으로 가공하여 활용하자.

그렇다... 어렵지 않다.

좋은 웹페이지 즐겨찾기