웹 스크래핑을 통해 데이터 수집을 할 때, BeautifulSoup
라이브러리의 string
, text
, get_text()
메소드를 사용합니다. 이들은 때로는 갖은 결과를 보여주고 때로는 다른 결과를 보여주기도 합니다. 이번 포스트에서는 이 세 가지 메소드를 사용하는 방법과 그 차이점을 정리해보도록 하겠습니다.
text
속성text
속성은 BeautifulSoup에서 가장 기본적인 텍스트 추출 도구 중 하나입니다. 이 속성을 사용하면 HTML 또는 XML 요소와 그 자식 요소에 포함된 모든 텍스트를 추출할 수 있습니다. text
는 해당 요소 아래에 있는 모든 텍스트를 연결하여 하나의 문자열로 반환합니다.
html = """
<div>
<p>안녕하세요.</p>
<p>웹스크래핑을 위한 포스트입니다.</p>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
text = soup.find('div').text
print(text)
위 코드에서 soup.find('div').text
는 <div>
태그 안에 있는 모든 <p>
태그의 텍스트를 연결하여 출력합니다. 이 방법은 간단하고 직관적이지만, 추가적인 형식 지정 옵션이 없기 때문에 때로는 제한적일 수 있습니다.
string
속성string
속성은 조금 더 특정한 경우에 사용됩니다. 이 속성은 요소가 단 하나의 자식 노드만을 가지고 있고, 그 자식 노드가 텍스트 노드일 경우 그 텍스트를 반환합니다. 만약 해당 요소에 여러 개의 자식이 있거나, 자식이 텍스트 노드가 아닌 경우에는 None
을 반환합니다.
html = """
<div>
<p>첫 번째 문단입니다.</p>
<p>두 번째 문단입니다.</p>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
string1 = soup.find('p').string
print(string1)
div_string = soup.find('div').string
print(div_string)
위 예제에서 첫 번째 <p>
태그의 string
속성은 "첫 번째 문단입니다."라는 텍스트를 반환합니다. 하지만 <div>
태그의 경우 자식 요소가 여럿 있으므로, string
속성은 None
을 반환합니다. string
속성은 정확히 하나의 텍스트 노드만을 다룰 때 유용하지만, 복잡한 HTML 구조에서는 제한적일 수 있습니다.
get_text()
메소드get_text()
메소드는 text
속성과 유사하지만, '메소드' 이기 때문에 몇가지 인자를 입력받아 추가적인 커스터마이징이 가능합니다. text
속성과 유사하게 요소와 그 자식 요소에 포함된 모든 텍스트를 반환합니다.
get_text()
는 텍스트를 추출할 때 separator
와 strip
같은 파라미터를 사용할 수 있습니다. separator
파라미터는 추출된 각 텍스트 조각 사이에 삽입할 문자열을 지정할 수 있게 해주며, strip
파라미터는 텍스트의 앞뒤 공백을 제거합니다.
html = """
<div>
<p>첫 번째 문단.</p>
<p>두 번째 문단.</p>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
text_with_separator = soup.find('div').get_text(separator=', ')
print(text_with_separator)
text_with_strip = soup.find('div').get_text(strip=True)
print(text_with_strip)
위 코드에서 text_with_separator
는 각 문단 사이에 쉼표와 공백을 구분자로 삽입한 텍스트를 반환합니다. 반면, text_with_strip
는 앞뒤의 공백을 제거한 텍스트를 반환합니다. get_text()
메소드는 웹 페이지에서 추출한 텍스트를 원하는 형태로 조정할 수 있습니다.