5장 연습 문제 예제 1번

명령행에 URL 주소를 입력하면 그 URL 의 HTML 문서를 화면에 출력하는 프로그램을 작성 하는 문제이다.
import urllib
import sys

def getpage(url) :
    f = urllib.urlopen(url)
    return f.read()

text = getpage(sys.argv[1])
print text
와 같은 코드가 미리 제시 되어 있고, 하위 3 문제를 푸는 것이다.

첫번째로, 명령행에서 인수가 입력 되지 않았을 때 사용법을 출력하도록 하는 것이다.

이것은 간단히 if 문을 이용 하면 된다.
import urllib
import sys

def getpage(url) :
    f = urllib.urlopen(url)
    return f.read()

if len(sys.argv) == 1 :
    print "How to use : get_html.py URL"
else :
    text = getpage(sys.argv[1])
    print text
와 같이 변경 할 수 있는데, 인수가 입력 되지 않으면 sys.argv 리스트의 값은 프로그램명 하나만 저장 되어 있다. 따라서 그 길이가 1 이기 때문에 이런 경우에 사용법을 출력해주면 된다.

*** 참고로 이 프로그램을 사용 할 때는 윈도우즈의 경우 명령 프롬프트에서 입력 해야 한다. 먼저 파일이 있는 디렉토리로 이동한다. 이동 방법은 cd (경로) 를 입력하면 이동 되는데, cd.. 을 입력하면 하위 폴더로 이동 되고, dir 을 입력하면 폴더에 있는 파일 목록이 보인다.

그 다음 파일 이름을 입력하여 실행 시키면 된다. 혹시 안된다면 python 의 경로를 입력해서 실행 시켜 본다. 예를 들어 python 이 c:\python26 에 위치 한다면 c:\python26\python (프로그램 이름)와 같이 입력한다.

그리고 URL 을 입력 할 때는 http://www.google.co.kr/ 과 같이 http:// 와 / 를 입력해 주어야 한다. 안 그러면 에러가 발생한다. 또, URL 을 입력 할 예로 네이버나 다음 보다는 구글이 html 길이가 짧다.

두번째로, 명령행에서 두개 이상의 인수를 받아서 출력 시키는 문제이다.
import urllib
import sys

def getpage(url) :
    f = urllib.urlopen(url)
    return f.read()

if len(sys.argv) == 1 :
    print "How to use : get_html.py URL"
else :
    for k in sys.argv[1:] :
        text = getpage(k)
        print text
와 같이 작성 해볼 수 있는데, sys.argv 리스트의 url 만을 가져오기 위해 sys.argv[1:] 를 사용 했고,

이것을 k 에 넘겨서 페이지를 출력하도록 했다.

세번째 문제는 잘못된 URL이 입력되면 그 URL 출력은 건너 뛰고, 나중에 잘못된 URL 목록을 출력하도록 하는 것이다.

잘못된 url 을 입력해보면 IO 에러가 발생 하는데, 문제는 이것을 지금 까지 배운 방법으로는 처리할 방법이 없다는 것이다. 에러가 발생하여 그 값이 리턴 된다면 if 문을 이용할 수도 있으나

그렇지도 않고 단순히 에러만 발생하고 프로그램이 종료 된다.

이것을 해결하는 방법으로 예외처리를 이용하는 방법이 있는데, 이것은 13장에 나오는 내용이다.

그러나 어렵지 않기 때문에 단순한 구문을 이용하여 작성해보면 아래와 같다.
import urllib
import sys

def getpage(url) :
    f = urllib.urlopen(url)
    return f.read()

if len(sys.argv) == 1 :
    print "How to use : get_html.py URL"
else :
    exceptlist = []

    for k in sys.argv[1:] :
        try:
            text = getpage(k)
            print text
        except IOError:
            exceptlist.append(k)

print 'Wrong Url :', exceptlist
잘못된 url 이 입력되어 try 문에서 에러가 발생하면 그 에러를 받아서 except 문에서 처리 하는 것이다.

이때, try 문 내에 for 문을 넣게 되면 에러가 발생할 경우 except 문을 실행 한 뒤 바로 else 문을 빠져나가기 때문에 for 문을 내에 예외 처리를 해주어야 한다.

댓글 없음:

댓글 쓰기