커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
지니뮤직 크롤링 중 title에서 delattr()를 사용할 수 있을까요?
undefined주차
북마크
서*하
댓글
5
추천
0
조회수
13
조회수
13
답변 완료

* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.

* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.


안녕하세요! 지니뮤직 크롤링 과제 중, title에서 strip() 외에 decompose, re.sub, delattr 등으로 19금 태그를 제거하려고 했는데, delattr 방식에서 실패했습니다.

title에서 <span class = "icon icon-19">를 제거하면 될 거라고 생각했는데,

getattr(title, 'span') 는 제대로 나오는데, hasattr(title, 'span')을 하면 전부다 True로 나옵니다. (오작동) 그리고 delattr(title, 'span')은 사용 불가했습니다.


python.org에서 찾아보니 The function deletes the named attribute, provided the object allows it. 이라고 나와 있었습니다.

스택 오버플로우에 저와 같은 질문을 한 문서가 있었는데, delattr(클래스명, '속성명') 형태로 사용하면 가능할 것이라는 답변이 있었습니다.

그런데 스택 오버플로우의 케이스는 본인이 직접 클래스, 변수, 함수를 다 설정한 경우였습니다. (html문서가 아니라 python이었음.)


크롤링의 경우는 delattr를 사용할 수 없는걸까요?


(delattr를 사용하려는 이유 : <span class = "icon icon-19">가 제거하고 싶은 문자열인 19금을 포함하고 있기 때문에, 해당 클래스를 통채로 삭제하면 없어질거라 생각했기 때문.)



크롤링 페이지 주소:

https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701


크롤링 하려는 페이지를 F12로 검사한 화면


getattr를 사용한 결과화면


delattr에 실패한 화면


작성한 코드 및 에러 메세지

import requests
import re
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701', headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
songs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for song in songs:
    rank = song.select_one('td.number').text.strip()[0:2].strip()
    title = song.select_one('td.info > a.title.ellipsis')
    singer = song.select_one('td.info > a.artist.ellipsis').text

    a = delattr(title, 'span')
    print(a)

----------------------------------------------

Traceback (most recent call last):
  File "E:\Sparta!\pythonprac\regexprac.py", line 15, in <module>
    a = delattr(title, 'span')
AttributeError: span

종료 코드 1(으)로 완료된 프로세스

오류 발생 시, 작성한 코드 전체와 에러 메시지를 첨부해 주세요.

Tip 1) </> 아이콘을 눌러 코드박스를 만들어 보세요.

Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어요!


취소
 공유
취소
댓글 0
댓글 알림
나의얼굴