python 콤마로 구분하는법

python 콤마로 구분하는법

QA

python 콤마로 구분하는법

답변 4

본문

안녕하세요.

 

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>     
</p>

이 질문에 댓글 쓰기 :

답변 4

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

 


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')
genres = [span.get_text(strip=True) for span in genres_span]
# 리스트를 쉼표로 구분된 문자열로 변환
result = ','.join(genres)
print(result)

안녕하세요.
혹시
<span class="badge badge-light" style="font-size:100%;"></span> 
이게 있으면 마지막에 , 가 하나씩 붙네요
데이터가 있는것만 ,콤마가 붙게 할수는 없나요?
로맨스,일상,학원,액션,    => 로맨스,일상,학원,액션
감사합니다.

다음과같이 해 보시겠어요


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)

안녕하세요.
다른 문제가 있어서 문의 드립니다.
아래와 같은 비슷한 소스가 한페이지에 있어서
결과값 : 로맨스,일상,일상,드라마
이렇게 나오네요

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

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>
'''

안녕하세요.

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

 

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)
 


import re
 
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>
"""
 
arr = re.findall(r'badge.*?>([^\s<]+)', strs)
arr_tostring = ','.join(arr)
print(arr)
print(arr_tostring)

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

 

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


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 != 'mb-3')
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)

다음과 같이 수정해 보시겠어요?


// 이전 코드 동일

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)

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)

다음과 같이 시도해 볼 수 있을 것 같습니다.


// 이전 코드 동일

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)

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 119
© SIRSOFT
현재 페이지 제일 처음으로