인프런 커뮤니티 질문&답변

김은준님의 프로필 이미지
김은준

작성한 질문수

내 업무를 대신 할 파이썬(Python) 웹크롤링 & 자동화 (feat. 주식, 부동산 데이터 / 인스타그램)

5.4 주식 일별 시세 데이터 part4 - Pandas 맛보기

전일비 상승,하락때문에 int화를 못하고 있는데

작성

·

26

0

5.4 영상보면 전일비는 숫자로만되어있네요

영상보면 전일비는 숫자로만되어있네요

image.png

 

 

제 코드는 아래와 같고 어떻게 상승,하락을 없애는지 모르겠습니다.

import requests

import bs4

import re

import time

total_data_list = [] # 추출하고자 하는 데이터 리스트를 모아놓을 곳

page_number = 1

pre_data_time_set = set() # 이전 페이지에서 추출한 데이터를 모아놓는 곳 cuz 중복되면 그만두게 하기 위해

while True: # 특정 조건이 만족하면 break로 루프 끝냄

# 페이지 번호를 포함한 url 생성 - {}.format을 사용해서 동적으로 사용

url2 = "https://finance.naver.com/item/sise_day.naver?code=453450&page={}".format(page_number)

# 해당 url로 요청

res2 = requests.get(url=url2, headers=headers2)

# 요청한 정보를 .text로 만든 뒤 파싱

soup3 = bs4.BeautifulSoup(res2.text, "lxml")

tr_eli = soup3.select("table.type2 > tr[onmouseover='mouseOver(this)']")

current_time_set = set() # 현재 페이지의 날짜 데이터를 저장할 set

for a in tr_eli: # tr_eli라는 ResultSet에서 하나씩 추출

td_eli = a.select("td") # a.select("td") = 위에서 추출한 것에서 'td' 태그를 포함한 것을 추츨하고 ResultSet으로 반환

# a는 태그지만 td_eli는 ResultSet이다 :

data_list = [] # 추출한 데이터를 담을 리스트

for i, td_real2 in enumerate(td_eli): # 추출한 ResultSet(열)들과 인덱스를 같이 순회

clean_data = re.sub(r'\s+', " ", td_real2.text.replace(",","")) # 숫자가 아닌 모든 문자를 제거

if clean_data == " ":

break

if i == 0: # 첫 번째 인덱스는 무조건 날짜임

current_time_set.add(clean_data)

data_list.append(clean_data)

if len(data_list) > 0: # data_list가 빈칸이 아닐경우에 total에다가 추가

total_data_list.append(data_list)

else: # eliment를 가져오는거 자체를 그만두게 하는 것

break

# 이전에 수집한 날짜와 현재 페이지의 날짜가 동일하면 루프 중단

if pre_data_time_set == current_time_set:

print("끝났다", page_number)

break

else:

pre_data_time_set = current_time_set # 현재 페이지의 날짜로 업데이트

time.sleep(3) # or random.random() * 2

page_number += 1 # 페이지 번호를 1씩 증가

# 결과 출력

for data in total_data_list: # total_data_list는 리스트 형식이라 리스트안에 리스트를 빼내는 작업하는 것

print(data)

# 중복되는 내용 없애는거는 나중에 DataFrame 사용하면 편한데 로직내에서도 가능하긴 하다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 김은준님의 전일비 상승, 하락 기호 때문에 int화를 못하는 문제와 관련하여 유사한 상황에 대한 해결 논의가 있었던 질문을 찾았습니다.

이는 웹 크롤링하는 과정에서 특정 텍스트내에 숫자가 아닌 문자(예: 상승, 하락, +, - 등)가 포함되어 있어, 숫자로만 이루어진 데이터를 추출하는 데 어려움을 겪는 상황과 매우 유사합니다.

문제를 해결하는 방식으로는 정규 표현식(Regular Expression)을 활용하는 방법이 있습니다. 정규 표현식을 이용해 숫자가 아닌 모든 문자를 제거(또는 필요한 문자만 추출)하고, 이를 통해 숫자만 남겨 데이터를 정제할 수 있습니다. 김은준님의 코드 중에 정규 표현식을 사용하는 부분이 이미 포함되어 있으나, 상승, 하락을 나타내는 기호(+, -)나 문자의 제거에 초점을 더 맞춰 조정이 필요해 보입니다.

  1. 상세한 설명을 찾고자 하는 경우 아래의 질문 및 답변 링크가 도움이 될 수 있습니다:

  2. 추출한 데이터에서 상승, 하락과 같이 특정 문자를 제거하는 방법에 대한 더 구체적인 예시 코드는 아래와 같습니다:
    ”`python
    import re

# 숫자, +, - 이외의 모든 문자를 제거
clean_data = re.sub(r’[^\d+-]‘, “”, td_real2.text)
“`
이 코드는 숫자(0-9), + 기호, - 기호를 제외한 모든 문자를 빈 문자열로 대체(즉, 삭제)합니다. 여기서 유의할 점은 만약 전일대비 상승이나 하락의 ‘+’, ‘-’ 기호까지도 제거하고 싶지 않다면, 정규 표현식의 패턴을 조정해야 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김은준님의 프로필 이미지
김은준

작성한 질문수

질문하기