미국 사회보장국은 그 해 미국에서 태어난 아기들에게 가장 인기 있는 이름이 무엇인지 연도별로 정리한 데이터를 가지고 있습니다( 사회보장 아기 이름).
이 연습을 위한 파일은 'babynames' google-python-exercises 내 디렉토리로 이동합니다 (아직 다운로드하지 않은 경우 google-python-exercises.zip을 다운로드하고 자세한 내용은 설정을 참고하세요). 아기이름.py에 코드를 추가합니다. Bay1990.htmlboy1992.html 파일에는 위의 사회보장 사이트 방문 페이지와 유사한 원시 html이 포함되어 있습니다. HTML을 살펴보고 어떻게 데이터를 스크래핑할 수 있을지 생각해 보세요.
파트 A
Baynames.py 파일에서 food*.html 파일의 파일 이름을 가져와 파일의 데이터를 단일 목록(목록 시작 부분의 연도 문자열 다음에 알파벳순으로 이름 순위 문자열)으로 반환하는 extract_names(filename) 함수를 구현합니다. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. main()을 수정하여 extract_names() 함수를 호출하고 반환되는 내용을 인쇄합니다 (main에는 명령줄 인수 파싱을 위한 코드가 이미 있음). 연도와 각 이름에 대한 정규 표현식을 익히는 데 문제가 있는 경우 이 문서의 끝부분에 솔루션 정규식 패턴을 표시합니다. 일반적으로 정규식은 웹페이지를 파싱하는 데 적합하지 않지만 이러한 웹페이지의 형식은 단순하고 일관적입니다.
남자 이름과 여자 이름을 별도로 취급하는 대신 그냥 한데 묶어 두겠습니다. 이름이 HTML에 두 번 이상 표시되는 경우도 있지만 이름당 하나의 숫자만 사용합니다. 선택사항: 알고리즘이 이 사례에 대해 스마트하게 설정하고 둘 중 더 작은 숫자를 선택합니다.
다음 단계를 시도하기 전에 각 단계에서 무언가를 실행/인쇄할 수 있도록 일련의 작은 마일스톤으로 프로그램을 구축합니다. 이는 숙련된 프로그래머가 사용하는 패턴입니다. 전체 프로그램을 하나의 큰 단계로 빌드하는 대신 각각 확인할 출력과 함께 일련의 증분 마일스톤을 빌드합니다.
한 마일스톤이 끝날 때 보유한 데이터를 인쇄하면 다음 마일스톤을 위해 해당 데이터를 재구성하는 방법을 생각하는 데 도움이 됩니다. Python은 이러한 점진적 개발에 적합합니다. 예를 들어 먼저 연도를 추출하여 출력하고 sys.exit(0)를 호출하는 시점까지 가져옵니다. 추천 일정은 다음과 같습니다.
- 파일에서 모든 텍스트를 추출하여 인쇄
- 연도를 찾아 추출하여 출력
- 이름과 순위 숫자를 추출하여 출력
- 이름 데이터를 dict로 가져와 출력
- [year, 'name rank', ... ] 목록을 작성하고 인쇄합니다.
- ExtractNames 목록을 사용하도록 main() 수정
이전에는 함수를 표준 출력으로 출력했습니다. 함수가 추출된 데이터를 *반환* 하도록 하면 더욱 재사용 가능하므로 호출자는 데이터를 출력하거나 다른 작업을 할 수 있습니다. (개발하는 동안 소규모 실험을 위해 함수 내에서 직접 인쇄할 수도 있습니다.)
main()에서 각 명령줄 인수에 extract_names()를 호출하고 텍스트 요약을 출력하도록 합니다. 목록을 합리적으로 보이는 요약 텍스트로 만들려면 조인을 영리하게 사용합니다. text = '\n'.join(mylist) + '\n'
각 파일의 요약 텍스트는 다음과 같이 표시됩니다.
2006 Aaliyah 91 Aaron 57 Abagail 895 Abbey 695 Abbie 650 ...
파트 B
텍스트를 표준 출력으로 인쇄하는 대신 텍스트가 포함된 파일을 작성하려고 한다고 가정해 보겠습니다. 플래그 --summaryfile이 있는 경우 다음을 수행합니다. 각 입력 파일 'foo.html'에 대해 표준 출력으로 인쇄하는 대신 새 파일 'foo.html.summary'를 작성합니다. 을 클릭합니다.
--summaryfile 기능이 작동하면 "./babynames.py --summaryfile Bay*.html"과 같이 *를 사용하여 모든 파일에서 프로그램을 실행합니다. 이렇게 하면 모든 요약이 한 단계로 생성됩니다. (셸의 표준 동작은 "baby*.html" 패턴을 일치하는 파일 이름 목록으로 확장한 다음, 셸이 Baynames.py를 실행하여 sys.argv 목록에 모든 파일 이름을 전달하는 것입니다.)
데이터를 요약 파일로 정리하면 다음과 같이 셸 명령어로 시간 경과에 따른 패턴을 확인할 수 있습니다.
$ grep 'Trinity ' *.summary $ grep 'Nick ' *.summary $ grep 'Miguel ' *.summary $ grep 'Emily ' *.summary
정규 표현식 힌트 -- 연도: r'Popularity\sin\s(\d\d\d\d)' name: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'