직접 해보는 손코딩 BeautifulSoup 스크래이핑 실행하기 



BeautifulSoup 모듈과, Flask 모듈을 설치합니다.




# 모듈을 읽어 들입니다.

from flask import Flask
from urllib import request
from bs4 import BeautifulSoup


# 웹 서버를 생성합니다.

app = Flask(__name__)
@app.route("/")

def hello():
#urlopen() 함수로 기상청의 전국 날씨를 읽어온다.
target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")

#BeautifulSoup를 사용해 웹 페이지를 분석한다.
soup = BeautifulSoup(target, "html.parser")

#location 태그를 찾습니다.
output = ""
for location in soup.select("location"):
# 내부의 city, wf, tmn, tmx 태그를 찾아 출력한다.
output += "<h3>{}</h3>".format(location.select_one("city").string)
output += "날씨: {}<br />".format(location.select_one("wf").string)
output += "최저/최고 기온: {}/{}"\
.format(\
location.select_one("tmn").string,\
location.select_one("tmx").string\
)
output += "<hr/>"
return output





실행을 할려고 명령어를 입력했는데 에러가 발생합니다. 엇... 아래와같이 명령어를 수정하고 코드를 실행합니다. 



set 을 export로변경하고 명령어를 실행하면 정상적으로 실행됩니다. 



웹페이지 실행시 에러가나면 해당화면이 나타납니다.  




오타를 수정한뒤 다시 샐행해보면 정상적으로 실행되는걸 확인할 수 있습니다. 





블로그 이미지

클라인STR

,

 - 구문 오류 : 프로그램이 실행되기전에 발생하는 오류를 말합니다. (괄호쓰기, 들여쓰기 오타 등에 문법오류)


print("# 프로그램시작")

print("# 구문오류)



[구문오류 예시]


구문오류에 경우 프로그램이 실행되기 전에 나타나는 오류입니다. 코드를 수정하지 않으면 프로그램이 실행조차 되지 않습니다.



- 예외  : 프로그램실행시  발생하는 오류를 Exception, RunTimeException 이라고 합니다. 


print("# 프로그램시작")

print(list_b[1])




해당코드를 실행해보면 주석으로 처리한 "프로그램시작" 출력되고 print 구문에서 런타이 오류가 발생하였습니다. 



선택미션 





정답을 확인해봅시다. 








블로그 이미지

클라인STR

,

223 쪽 [직접 해보는 손코딩: 범위 내부의 정수를 모두 더하는 함수] 실행 후 코드가 입력된 화면 및 실행결과 화면 인증샷





매개변수, 기본 매개변수, 가변 매개변수에 대해서 정리해보자 


def 함수(매개변수):

      변수 = 초깃값

...... 

return 변수


매개변수는 함수의 괄호 내부에 넣는 파라메터 값을 의미합니다. 

기본 매개변수는 매개변수 값에 아무것도 넣지않을때 들어가는 default 값을 말합니다. 


def sum_all(start=0, end=200, step=1):
# 변수를 선업합니다.
output = 0

# 반복문을 돌려 숫자를 더합니다.

for i in range(start, end + 1, step):
output += i

# 리턴 합니다.

return output


# 함수 호출

print("A", sum_all(0, 100, 10))
print("B", sum_all())




가변 매개변수 함수는 매개변수를 원하는 만큼 받을 수 있는 함수를 말합니다. 매개변수를 원하는 만큼 받을 수 있는 함수의 변수를 가변 매개 변수라고 합니다. 



def 함수이름 (매개변수, 매개변수, ....., *가변 매개변수):

      구문


가변 매개변수 뒤에는 일반매개변수가 올 수 없습니다. 가변 매개변수는 하나만 사용할 수 있습니다. 


def print_n_times(n, *values):
# n 번 반복합니다.
for i in range(n):
#values 는 리스트처럼 활용합니다.

for value in values:
print(value)

#단순한 줄바꿈
print()

# 함수를 호출합니다.

print_n_times(3, "안녕하세요", "즐거운", "파이썬 프로그램밍")




블로그 이미지

클라인STR

,

1. 리스트


파이썬에서 리스트

  • 여러가지 데이터를 저장할 수 있는 자료형 이다. 
  • 데이터의 추가 , 삭제 ,수정이 가능하다.
  • 인덱스로 데이터의 접근이 가능하다.

array = [273, 32, 103, "문자열", True, False]
print(array)



리스트의 인덱스는 0부터 시작합니다. 


print(array[0])

print(array[2])

print(array[4])

print(array[1:3])

print("=======================")

print(array[-1])

print(array[-2])

print(array[-3])


2. 리스트 연산


리스트는 인덱스를 이용하여 데이터에 접근가능합니다. 범위연산자를 사용하거나, 음수를 사용하여 요소를 뒤에서부터 선택할 수 있습니다.


리스트는 +,* 사용하여 연산이 가능합니다. 


array = [1,2,3]

array2 = [4,5,6]


print("# 리스트")

print("array = ", array)
print("array2 = ", array2)
print()

print("# 리스트 기본 연산자")
print("array + array2 =", array + array2)
print("array * 3", array * 3)
print()





len() 함수는 문자열의 인수로 올경우 글자수를 리턴하지만, 리스트 변수를 넣을경우 요소의 개수를 리턴합니다. 



3. 리스트 요소 추가 및제거하기 


리스트 요소를 추가할 때는 append(), insert() 함수를 사용합니다. 

append()함수는 리스트 뒤쪽에 항상 요소를 추가합니다. 반면에 insert()함수는 원하는 위치에 요소값을 추가할 수 있습니다. 


array = [1, 2, 3]

print("# 리스트 요소에 추가하기")
array.append(4)
array.append(5)
array.append(6)
print(array)
print()

print("# 리스트 중간에 요소 추가하기")
array.insert(3, 10)
print(array)


print("# 리스트 extend 함수")
lista = [1,2,3]
lista.extend([4,5,6])
print(lista)


print("# 리스트 제거하기")
del lista[0]
print(lista)

print("# 리스트 제거하기 POP")
lista.pop(3)
print(lista)


리스트에서 요소를 삭제할경우 인덱스를 이용해서 제거하거나, 값을 이용해서 제거할 수 있습니다. 


del 키워드를 사용할경우 원하는 인덱스에 해당하는 값을 삭제할 수 있습니다. pop()함수를 이용할 경우 마찬가지로 인덱스를 줄 수 있습니다.

만약 인덱스를 주지 않을경우 마지막 요소의 리스트 값을 삭제합니다. 


값으로 제거하는 경우 remove() 함수를 사용합니다. 리스트내부에서 해당내부 값을 찾아 제거한다. 

remove()함수에 경우 삭제할 값이 여러개인경우 하나만 제거됩니다. 리스트에서 해당하는 값을 전부지울려면 반복문을 사용하면 됩니다. 



4.딕셔너리 


딕셔너리는 Key ,Value 형태의 값을 저장하는 자료형입니다. 


dictionary = {

"키A" : "값A",
"키B" : "값B",
"키C" : "값C",
}



딕셔녀리 반복문 출력하기 


dictionary = {

"키A" : "값A",
"키B" : "값B",
"키C" : "값C",
}


print("# 딕셔너리 items() 함수")
print("items():", dictionary.items)
print()


print("# 딕셔너리의 items() 함수와 반복문 조합하기")
for key, element in dictionary.items():
print("dictionary [{}] = {}".format(key, element))



print("# 리스트 내포하기")

array = []

for i in range(0,20, 2) :
array.append(i*i)

print(array)



딕셔너리 데이터 접근 및 변경 삭제 예시


dictionary = {
"name" : "건조 망고",
"type" : "당절임",
"ingredient" : ["망고", "설탕", "메타중아황산나트륨", "치자황색소"],
"origin" : "필리핀"
}

#값 출력
print("name : ", dictionary["name"])
print("type : ", dictionary["type"])
print("ingredient : ", dictionary["ingredient"])
print("origin : ", dictionary["origin"])
print()

#값 변경

dictionary["name"] = "8D 건조 망고"
print("name : ", dictionary["name"])


dictionary["price"] = 5000
print(dictionary)


del dictionary["ingredient"]
print(dictionary)



선택미션 




블로그 이미지

클라인STR

,

 3. 사용자에게 태어난 연도를 입력받아 띠를 출력하는 프로그램을 작성해 주세요. 작성 시 입력을 받은 연도를 12로 나눈 나머지를 사용합니다.

나머지가 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11일 때 각각 원숭이, 닭, 개, 돼지, 쥐, 소, 범, 토끼, 용, 뱀, 말, 양띠 입니다.


    

    가장 단순한 형태이지 않을까 싶네요. 단점으로 보면 if문 구문안에  계산로직이 각각 들어가 있는 형태입니다. 만약에 계산로직이 변경되는 경우라면 

 12개의 if구문을 바꿔줘야되는 경우가 생깁니다. 그래서 아래의 형태로 구문을 좀더 압축할 수  있습니다. 


    


실행결과는 아래와 같습니다. 



참고로 검증을 위해서 네이버에 검색해서 띠별년도에 해당하는 내역을 검색해보았습니다.  


해당조건을 만족하는 로직을 작성한경우 반듯이 실제값이 제대로 동작하는지 확인하는게 중요합니다. 특히 실무에서는요 ^^ 



파이썬의 if 구문 정리 


파이썬의 공부하면서 느끼는건 자바랑 자바스크립트 기타 언어를 먼저 다뤄본 입장에서는 차이점이 다소 존재합니다. 


if 기본형 


if 조건 :

  조건이 참일때 실행됨

else :

조건이 거짓일때 실행됨 


if구문 괄호랑 ':' 쓰는부분이 좀다른데 아직까지는 좀 적응이 안되네요 ^^ 빨리 익숙해졌으면 좋겠습니다. 



elif 구문 



if 조건A :

   A조건이 참일때 실행됨

elif 조건B :

   B조건이 참일때 실행됨

elif 조건C:

   C조건이 참일때 실행됨 

...... 

else : 

     모든조건에 해당되지 않을때 실행됨


if elif 패턴으로 조건을 실행할경우 해당조건이 참인경우 해당조건 아래로는 조건구문을 검사하지 않고 구문수행이 끝나버립니다. 


3.번 출력 결과를 보면 2016년 을입력한경우 나머지가 0인경우이므로 원숭이띠를 출력하고 프로그램실행이 종료됩니다.  


해당예제를 아래와 같이 if구문을 변경해보고 실행을 하면 좀더 명확하게 알 수 있습니다. 



원숭이 조건을 if 구문으로 변경하여 5개정도 바꿔주고 실행후 2016년 을 입력해서 결과 값을  확인해봅니다. 



여기서 기존소스를 아래와 같이 변경해보고 다시 실행해보겠습니다. 구문 형태를 if elif 패턴으로 다시 바꾸고 같은조건으로 5개 동일하게 줍니다.

그리고 실행을 해봅니다. 





실행해보면 젤 첫번째 if조건이 수행되고 프로그램은 종료됨을 알 수 있습니다.  

실무에서 사용할때 종종 실수를 할 수 있는 부분이기도 해서 한번 내용을 추가해봤습니다. 

if elif 구문 패턴을 쓰는경우도 있지만 if구문을 연속적으로 걸어서 처리하는 경우도 많이쓰입니다.  

그럼 이상 과제를 마치겠습니다. ^^




#혼공단  #혼공파

블로그 이미지

클라인STR

,


과제를 하기전에 예전에 파이썬을 설치했던 터라 다음과같은 에러를 발견하였습니다. 




구글링을 해서 확인해보니 제가 설치한 파이썬 버전이 실행되지 않고 mac OS에 기본으로 설치된 파이썬 2.X때 버전이 실행되면서 해당에러메세지를 나타냅니다. 아래와 같이 python -> python3로 변경하면 정상적으로 프로그램이 실행됩니다. 



매번 python3 라고 입력하기 번거로우니 bash_profile 설정을 아래와같이 변경하면 편하게 사용할 수 있습니다.  변경한 내용이 적용되 지않는 경우  source~/.bash_profile   명령어를 입력해줍니다. 



 3. 다음 프로그램의 실행 결과를 예측해 보세요.


  print("# 연습문제")

  print("\\\\\\\\")

  print("-" * 8)



4. 다음 프로그램의 실행 결과를 예측해 보세요. 그런데 이 예제를 실행하면 오류가 발생합니다. 몇행에서 어떤 오류가 발생할까요? 그리고 그 이유는 무엇인지 말해보세요.


 print("안녕하세요"[1])

 print("안녕하세요"[2])

 print("안녕하세요"[3])   

 print("안녕하세요"[4])

 print("안녕하세요"[5])



인덱스는 0부터 시작합니다. 안녕하세요에 해당 문자열은 0~4번까지 인덱스가 존재하여 해달 오류 메세지가 출력됩니다.



5. 다음 프로그램의 실행결과를 예측해보세요.


print("안녕하세요"[1:3])

print("안녕하세요"[2:4])

print("안녕하세요"[1:])

print("안녕하세요"[:3])




참고 : Mac 파이썬 3.x 사용하기


#혼공단 #혼공파

블로그 이미지

클라인STR

,