BeautifulSoup에서 텍스트 추출하는 법 : text, string, get_text() 비교

소환인·2023년 12월 14일
0

스터디노트

목록 보기
38/48

들어가며

웹 스크래핑을 통해 데이터 수집을 할 때, 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()는 텍스트를 추출할 때 separatorstrip 같은 파라미터를 사용할 수 있습니다. 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() 메소드는 웹 페이지에서 추출한 텍스트를 원하는 형태로 조정할 수 있습니다.

profile
돌고돌아

0개의 댓글