84 — 웹: 페이지에서 링크 뽑아내기
55가 JSON을 가져왔고, 69가 정규식으로 텍스트를 찾았습니다. 웹 페이지도 그냥 텍스트입니다 — 내용을 태그로 감싼 HTML일 뿐입니다. 링크를 뽑는 것은 원시 페이지에 정규식 하나이고, 서버 주소를 이어 붙이면 브라우저가 쓰는 완전한 주소가 됩니다.
단계
링크 세 개가 있는 작은 페이지를 만드세요.
page.html로 저장:<html> <head><title>my page</title></head> <body> <h1>Links</h1> <a href="story.txt">the story</a> <a href="notes.txt">notes</a> <a href="about.html">about us</a> </body> </html>55에서처럼 폴더를 서빙하세요:
python3 -m http.server 8000페이지를 받는 것은 JSON을 받은 것과 같은
urlopen호출입니다. 페이지는 텍스트라서.decode("utf-8")이 HTML을 줍니다:
실행해 보기 →from urllib.request import urlopen import re base = "http://localhost:8000" html = urlopen(base + "/page.html").read().decode("utf-8")링크는
href="와 다음"사이에 있습니다. 정규식r'href="([^"]+)"'이 전부 찾습니다 —[^"]+는 "따옴표가 아닌 문자 하나 이상"이고,findall은 69에서처럼 잡힌 부분만 돌려줍니다.links.nme로 저장하세요:
실행해 보기 →# links.nme — 웹 페이지에서 링크 찾기. # 실행: nme 실행 links # 먼저 이 폴더에서 python3 -m http.server 8000 실행 from urllib.request import urlopen import re base = "http://localhost:8000" html = urlopen(base + "/page.html").read().decode("utf-8") links = re.findall(r'href="([^"]+)"', html) show f"found {len(links)} links:" for link in links: show base + "/" + link페이지는
story.txt— 자기 자신 기준의 짧은 이름만 알고 있습니다. 앞에base + "/"를 붙이면 브라우저가 열 수 있는 완전한 주소가 됩니다: 같은 서버의 페이지는 짧은 이름으로 링크하고, 클라이언트가 채워 넣습니다.실행하세요:
nme 실행 linksfound 3 links: http://localhost:8000/story.txt http://localhost:8000/notes.txt http://localhost:8000/about.html세 개의
href가 완전한 주소 세 개가 되었습니다. 링크 검사기나 웹 크롤러가 다음 페이지를 받기 전에 하는 것과 똑같은 추출 단계입니다.
직접 해보기
링크가 있는 다른 페이지로 가는 링크를 하나 추가하고, 프로그램이 찾은
각 링크를 받아 존재하는지 세어 보세요 (404 Not Found 응답은 링크가
깨졌다는 뜻 — HTTP 오류는 예외로 나타나고, 68이
잡는 법을 보여 줍니다). 또는 같은 패턴으로 페이지의 src="..."
이미지 소스를 뽑아 보세요.
배운 것
- HTML은 텍스트입니다:
urlopen으로 받고, 풀고, 정규식으로 찾습니다. r'href="([^"]+)"'가 링크 대상을 찾고,[^"]+가 닫는 따옴표에서 멈춥니다.- 상대 링크는 짧은 이름이고, 클라이언트가 서버 주소를 앞에 붙입니다.
- 링크 추출은 정규식 하나 — 링크 검사기의 첫 단계입니다.