테스트 사이트 - 개발 중인 베타 버전입니다

python 콤마로 구분하는법 채택완료

망고프리 1년 전 조회 2,010

안녕하세요.

 

python select나 다른 방법이 있으면 아래와 같은 소스가 있을시

로맨스,일상,학원,액션

콤마구분로 구분하여 tag를 만들려고 합니다.

어떻게 하면 될까요?

감사합니다.

 

<p class="text-muted" style="font-size:13px;">
    <span class="text-muted" style="">장르</span> 
    <span class="badge badge-light" style="font-size:100%;">로맨스 </span>
    <span class="badge badge-light" style="font-size:100%;">일상 </span>
    <span class="badge badge-light" style="font-size:100%;">학원 </span>
    <span class="badge badge-light" style="font-size:100%;">액션 </span>
    <span class="badge badge-light" style="font-size:100%;"></span> &nbsp;&nbsp;&nbsp;&nbsp;
</p>

댓글을 작성하려면 로그인이 필요합니다.

답변 4개

채택된 답변
+20 포인트

예를들어 다음과 같이 하시면 가능하지 않을까 합니다.

 

</p>

<p>from bs4 import BeautifulSoup</p>

<p>html_code = '''

<p class="text-muted" style="font-size:13px;">

    <span class="text-muted" style="">장르</span>

    <span class="badge badge-light" style="font-size:100%;">로맨스 </span>

    <span class="badge badge-light" style="font-size:100%;">일상 </span>

    <span class="badge badge-light" style="font-size:100%;">학원 </span>

    <span class="badge badge-light" style="font-size:100%;">액션 </span>

    <span class="badge badge-light" style="font-size:100%;"></span>   

</p>

'''</p>

<p>soup = BeautifulSoup(html_code, 'html.parser')</p>

<p># 'badge-light' 클래스를 가진 span 태그들을 찾아서 텍스트를 추출

genres_span = soup.find_all('span', class_='badge-light')

genres = [span.get_text(strip=True) for span in genres_span]</p>

<p># 리스트를 쉼표로 구분된 문자열로 변환

result = ','.join(genres)</p>

<p>print(result)</p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 5개

망고프리
1년 전
잘 실행되네요
감사합니다.
망고프리
1년 전
안녕하세요.
혹시
<span class="badge badge-light" style="font-size:100%;"></span>
이게 있으면 마지막에 , 가 하나씩 붙네요
데이터가 있는것만 ,콤마가 붙게 할수는 없나요?
로맨스,일상,학원,액션, => 로맨스,일상,학원,액션
감사합니다.
웹메이킹
1년 전
다음과같이 해 보시겠어요
[code]
from bs4 import BeautifulSoup

html_code = '''
<p class="text-muted" style="font-size:13px;">
<span class="text-muted" style="">장르</span>
<span class="badge badge-light" style="font-size:100%;">로맨스 </span>
<span class="badge badge-light" style="font-size:100%;">일상 </span>
<span class="badge badge-light" style="font-size:100%;">학원 </span>
<span class="badge badge-light" style="font-size:100%;">액션 </span>
<span class="badge badge-light" style="font-size:100%;"></span>
</p>
'''

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

# 'badge-light' 클래스를 가진 span 태그들을 찾아서 텍스트를 추출
genres_span = soup.find_all('span', class_='badge-light')

# 빈 span 태그를 제외하고 데이터가 있는 경우에만 콤마를 붙임
genres = [span.get_text(strip=True) for span in genres_span if span.get_text(strip=True)]

# 리스트를 쉼표로 구분된 문자열로 변환
result = ','.join(genres)
print(result)
[/code]
망고프리
1년 전
잘되네요.
정말 감사합니다.
망고프리
1년 전
안녕하세요.
다른 문제가 있어서 문의 드립니다.
아래와 같은 비슷한 소스가 한페이지에 있어서
결과값 : 로맨스,일상,일상,드라마
이렇게 나오네요

원하는 결과값 : 로맨스,일상

class=text-muted 이면서 class=badge-light 면 될거 같은데
어떻게 하면 될까요?
감사합니다.
(text-muted mb-3 제외)

html_code = '''
<p class="text-muted" style="font-size:13px;">
<span class="text-muted" style="">장르</span>
<span class="badge badge-light" style="font-size:100%;">로맨스 </span>
<span class="badge badge-light" style="font-size:100%;">일상 </span>
<span class="badge badge-light" style="font-size:100%;"></span>
</p>

<p class="text-muted mb-3" style="margin-top:-30px;">
<span class="badge badge-light"></span>
<span class="badge badge-light">일상</span>
<span class="badge badge-light"></span>
</p>

<p class="text-muted mb-3" style="margin-top:-30px;">
<span class="badge badge-light"></span>
<span class="badge badge-light">드라마</span>
<span class="badge badge-light"></span>
</p>
'''

댓글을 작성하려면 로그인이 필요합니다.

BeautifulSoup를 사용하여 HTML 코드를 파싱하고 필요한 정보를 추출하는 방식으로 하시면 되지 않을까 합니다.

 

참고 하셔서 원시는 형식으로 구현을 하시면 될 것 같습니다.

</p>

<p>from bs4 import BeautifulSoup</p>

<p>html_code = '''

<p class="text-muted" style="font-size:13px;">

    <span class="text-muted" style="">장르</span>

    <span class="badge badge-light" style="font-size:100%;">로맨스 </span>

    <span class="badge badge-light" style="font-size:100%;">일상 </span>

    <span class="badge badge-light" style="font-size:100%;"></span> 

</p></p>

<p><p class="text-muted mb-3" style="margin-top:-30px;">

  <span class="badge badge-light"></span>

  <span class="badge badge-light">일상</span>

  <span class="badge badge-light"></span>

</p></p>

<p><p class="text-muted mb-3" style="margin-top:-30px;">

  <span class="badge badge-light"></span>

  <span class="badge badge-light">드라마</span>

  <span class="badge badge-light"></span>

</p>

'''</p>

<p>soup = BeautifulSoup(html_code, 'html.parser')</p>

<p># 결과값을 저장할 리스트

result_genres = []</p>

<p># p 태그 중에서 class가 "text-muted"이고 "mb-3"이 아닌 것들을 선택

genre_paragraphs = soup.find_all('p', class_='text-muted', class_=lambda x: x != 'mb-3')</p>

<p>for paragraph in genre_paragraphs:

    # 현재 p 태그의 하위에 있는 span 태그 중에서 class가 "badge-light"인 것들의 텍스트 추출

    genres = [span.text.strip() for span in paragraph.find_all('span', class_='badge-light')]

    

    # 결과값 리스트에 추가

    result_genres.extend(genres)</p>

<p># 중복을 제거하고 출력

result_genres = list(set(result_genres))

print(result_genres)

로그인 후 평가할 수 있습니다

답변에 대한 댓글 6개

망고프리
1년 전
안녕하세요.
class_= lambda x: x != 'mb-3'

이부분에서 오류가 발생해서 실행이 안되네요.
감사합니다.
웹메이킹
1년 전
다음과 같이 수정해 보시겠어요?
[code]
// 이전 코드 동일

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

# 결과값을 저장할 리스트
result_genres = []

# p 태그 중에서 class가 "text-muted"이고 "mb-3"이 아닌 것들을 선택
genre_paragraphs = soup.find_all('p', class_='text-muted', class_=lambda x: x and 'mb-3' not in x)

for paragraph in genre_paragraphs:
# 현재 p 태그의 하위에 있는 span 태그 중에서 class가 "badge-light"인 것들의 텍스트 추출
genres = [span.text.strip() for span in paragraph.find_all('span', class_='badge-light')]

# 결과값 리스트에 추가
result_genres.extend(genres)

# 중복을 제거하고 출력
result_genres = list(set(result_genres))
print(result_genres)
[/code]
망고프리
1년 전
genre_paragraphs = soup.find_all('p', class_='text-muted', class_=lambda x: x and 'mb-3' not in x)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: keyword argument repeated: class_

안녕하세요.
똑같은 오류가 발생하네요.


from bs4 import BeautifulSoup
html_code = '''
<p class="text-muted" style="font-size:13px;">
<span class="text-muted" style="">장르</span>
<span class="badge badge-light" style="font-size:100%;">로맨스 </span>
<span class="badge badge-light" style="font-size:100%;">일상 </span>
<span class="badge badge-light" style="font-size:100%;"></span>
</p>
<p class="text-muted mb-3" style="margin-top:-30px;">
<span class="badge badge-light"></span>
<span class="badge badge-light">일상</span>
<span class="badge badge-light"></span>
</p>
<p class="text-muted mb-3" style="margin-top:-30px;">
<span class="badge badge-light"></span>
<span class="badge badge-light">드라마</span>
<span class="badge badge-light"></span>
</p>
'''
soup = BeautifulSoup(html_code, 'html.parser')
# 결과값을 저장할 리스트
result_genres = []
# p 태그 중에서 class가 "text-muted"이고 "mb-3"이 아닌 것들을 선택
genre_paragraphs = soup.find_all('p', class_='text-muted', class_=lambda x: x and 'mb-3' not in x)
for paragraph in genre_paragraphs:
# 현재 p 태그의 하위에 있는 span 태그 중에서 class가 "badge-light"인 것들의 텍스트 추출
genres = [span.text.strip() for span in paragraph.find_all('span', class_='badge-light')]

# 결과값 리스트에 추가
result_genres.extend(genres)

# 중복을 제거하고 출력
result_genres = list(set(result_genres))
print(result_genres)
웹메이킹
1년 전
다음과 같이 시도해 볼 수 있을 것 같습니다.

[code]
// 이전 코드 동일

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

# 결과값을 저장할 리스트
result_genres = []

# class가 "text-muted"이면서 "mb-3"이 아닌 p 태그를 선택
genre_paragraphs = soup.find_all('p', class_=lambda x: x and 'text-muted' in x and 'mb-3' not in x)

for paragraph in genre_paragraphs:
# 현재 p 태그의 하위에 있는 span 태그 중에서 class가 "badge-light"인 것들의 텍스트 추출
genres = [span.text.strip() for span in paragraph.find_all('span', class_='badge-light')]

# 결과값 리스트에 추가
result_genres.extend(genres)

# 중복을 제거하고 출력
result_genres = list(set(result_genres))
print(result_genres)
[/code]
망고프리
1년 전
안녕하세요.
웹메이킹님 덕분에 잘 처리 되었습니다.

감사합니다.
웹메이킹
1년 전
BeautifulSoup의 find_all 메서드에서 class_ 매개변수를 두 번 사용하는 것이 문제가 되었던 거였네요..

댓글을 작성하려면 로그인이 필요합니다.

1년 전

</p>

<p>import re</p>

<p> </p>

<p>strs = """

<p class="text-muted" style="font-size:13px;">

    <span class="text-muted" style="">장르</span> 

    <span class="badge badge-light" style="font-size:100%;">로맨스 </span>

    <span class="badge badge-light" style="font-size:100%;">일상 </span>

    <span class="badge badge-light" style="font-size:100%;">학원 </span>

    <span class="badge badge-light" style="font-size:100%;">액션 </span>

    <span class="badge badge-light" style="font-size:100%;"></span>     

</p>

"""</p>

<p> </p>

<p>arr = re.findall(r'badge.*?>([^\s<]+)', strs)

arr_tostring = ','.join(arr)



print(arr)

print(arr_tostring)</p>

<p>

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

1년 전

안녕하세요.

아래의 내용을 참고해 보시겠어요?

 

genres = "로맨스,일상,학원,액션"

# 장르를 콤마로 분리
genre_list = genres.split(',')

# HTML 태그 생성
html_tags = '<p class="text-muted" style="font-size:13px;">\n' \
            '    <span class="text-muted" style="">장르</span> \n'

for genre in genre_list:
    html_tags += f'    <span class="badge badge-light" style="font-size:100%;">{genre} </span>\n'

html_tags += '    <span class="badge badge-light" style="font-size:100%;"></span>     \n' \
             '</p>'

print(html_tags)
 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인