Bài tập Python tên trẻ em

Chính quyền an sinh xã hội có dữ liệu gọn gàng này theo năm tên những tên phổ biến nhất đối với những trẻ sinh ra trong năm đó ở Hoa Kỳ (xem tên bé an sinh xã hội).

Các tệp của bài tập này nằm trong thư mục "babynames" thư mục bên trong google-python-exercises (tải tệp google-python-exercises.zip xuống nếu bạn chưa có, hãy xem phần Thiết lập để biết thông tin chi tiết). Hãy thêm mã của bạn trong Babynames.py. Các tệp Baby1990.html Baby1992.html ... chứa html thô, tương tự như những gì bạn truy cập vào trang an sinh xã hội ở trên. Xem xét html và suy nghĩ về cách bạn có thể trích xuất dữ liệu ra khỏi đó.

Phần A

Trong tệp Babynames.py, hãy triển khai hàm extract_names(filename) lấy tên tệp của tệp Baby*.html và trả về dữ liệu từ tệp dưới dạng một danh sách duy nhất -- chuỗi năm ở đầu danh sách theo sau là chuỗi thứ hạng tên theo thứ tự bảng chữ cái. ['2006', "Aaliyah 91", "Abagail 895", "Aaron 57", ...]. Sửa đổi main() để gọi hàm extract_names() của bạn và in nội dung trả về (chính đã có mã để phân tích cú pháp đối số dòng lệnh). Nếu bạn gặp khó khăn khi tìm biểu thức chính quy cho năm và mỗi tên, mẫu biểu thức chính quy giải pháp được hiển thị ở cuối tài liệu này. Lưu ý rằng để phân tích cú pháp các trang web nói chung, biểu thức chính quy không phát huy được hiệu quả, nhưng những trang web này có định dạng đơn giản và nhất quán.

Thay vì tách riêng tên con trai và tên con gái, chúng tôi sẽ chỉ gộp chúng lại với nhau. Trong một số năm, một tên xuất hiện nhiều lần trong html nhưng chúng tôi chỉ sử dụng một số cho mỗi tên. Không bắt buộc: Giúp thuật toán trở nên thông minh đối với trường hợp này và chọn bất kỳ số nào nhỏ hơn.

Xây dựng chương trình dưới dạng một chuỗi các mốc quan trọng nhỏ, mỗi bước để chạy/in nội dung nào đó trước khi thử bước tiếp theo. Đây là mẫu được những lập trình viên có kinh nghiệm sử dụng – xây dựng một loạt các mốc quan trọng tăng dần, mỗi mốc có một số kết quả cần kiểm tra, thay vì xây dựng toàn bộ chương trình trong một bước quan trọng.

Khi in dữ liệu bạn có ở cuối một mốc quan trọng, bạn có thể suy nghĩ về cách điều chỉnh cấu trúc dữ liệu cho mốc tiếp theo. Python rất phù hợp với phong cách phát triển dần dần này. Ví dụ: trước tiên, hãy chuyển đến điểm trích xuất và in năm và gọi sys.exit(0). Dưới đây là một số mốc được đề xuất:

  • Trích xuất tất cả văn bản từ tệp và in tệp đó
  • Tìm và trích xuất năm rồi in ra
  • Trích xuất tên và xếp hạng số và in chúng
  • Lấy dữ liệu tên thành một lệnh chính tả và in ra
  • Tạo danh sách [year, 'name hạng', ... ] và in danh sách đó
  • Sửa lỗi main() để sử dụng danh sách ExtractNames

Trước đây, chúng ta có các hàm chỉ in để chuẩn hoá. Có thể tái sử dụng nhiều hơn nếu bạn sử dụng hàm *trả về* dữ liệu đã trích xuất, để sau đó phương thức gọi có lựa chọn in dữ liệu đó hoặc làm việc gì khác với dữ liệu đó. (Bạn vẫn có thể in trực tiếp từ bên trong các hàm của mình cho các thử nghiệm nhỏ trong quá trình phát triển.)

Yêu cầu main() gọi extract_names() cho mỗi đối số dòng lệnh và in một bản tóm tắt văn bản. Để biến danh sách thành văn bản tóm tắt trông hợp lý, sau đây là cách sử dụng kết hợp khéo léo: text = '\n'.join(mylist) + '\n'

Văn bản tóm tắt cho từng tệp sẽ có dạng như sau:

2006
Aaliyah 91
Aaron 57
Abagail 895
Abbey 695
Abbie 650
...

Phần B

Giả sử thay vì in văn bản theo chuẩn, chúng ta muốn ghi các tệp chứa văn bản. Nếu có cờ --summaryfile, hãy làm như sau: đối với mỗi tệp đầu vào 'foo.html', thay vì in thành đầu ra chuẩn, hãy ghi một tệp mới 'foo.html.summary' có chứa văn bản tóm tắt cho tệp đó.

Khi tính năng --summaryfile hoạt động, chạy chương trình trên tất cả các tệp bằng cách sử dụng * như sau: "./babynames.py --summaryfile bé*.html". Thao tác này sẽ tạo tất cả bản tóm tắt trong một bước. (Hành vi tiêu chuẩn của shell là nó mở rộng mẫu "baby*.html" thành danh sách tên tệp phù hợp, sau đó shell sẽ chạy Babynames.py, truyền tất cả các tên tệp đó vào danh sách sys.argv.)

Với dữ liệu được sắp xếp thành các tệp tóm tắt, bạn có thể xem các mẫu theo thời gian bằng các lệnh shell, chẳng hạn như:

$ grep 'Trinity ' *.summary
$ grep 'Nick ' *.summary
$ grep 'Miguel ' *.summary
$ grep 'Emily ' *.summary

Gợi ý biểu thức chính quy -- năm: r'common\sin\s(\d\d\d\d)' tên: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'