美国社会保障管理局按照年份,在美国出生的婴儿中最受欢迎(请参阅 社会安全婴儿名字)。
此练习的文件位于“babynames”中目录(如果尚未下载,请参阅设置,下载 google-python-exercises.zip)。在 Babynames.py 中添加您的代码。文件 Baby1990.html Baby1992.html ... 包含原始 html,与访问上述社会保障网站时所得到的内容类似。查看 html 并思考如何从其中抓取数据。
A 部分
在 Babynames.py 文件中,实现 extract_names(filename) 函数,该函数会接受婴儿*.html 文件的文件名,并将文件中的数据作为单个列表返回(列表开头的年份字符串,后跟按字母顺序排列的名称-排名字符串)。['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]。修改 main(),以使其调用 extract_names() 函数并输出其返回的内容(main 已包含用于解析命令行参数的代码)。如果您在计算年份和名称的正则表达式时遇到困难,请参阅本文档末尾处的正则表达式模式。请注意,一般来说,正则表达式不太擅长解析网页,但这些网页的格式简单且一致。
我们不会单独处理男孩和女孩的姓名,而是将它们集中在一起。某些年中,某个名称在 HTML 中会多次出现,但我们只会为每个名称使用一个数字。可选:使算法针对这种情况更智能,并选择较小的数字。
将程序构建为一系列小里程碑,使每个步骤都运行/打印一些内容,然后再尝试下一步。这也是经验丰富的程序员使用的模式:构建一系列增量里程碑,每个里程碑都需要检查一些输出内容,而不是用一个大步骤来构建整个程序。
输出在里程碑结束时获得的数据有助于您思考如何针对下一个里程碑重新组织数据结构。Python 非常适合这种风格的增量开发。例如,首先使其到达提取和输出年份并调用 sys.exit(0) 的位置。下面是一些建议的里程碑:
- 从文件中提取所有文本并输出
- 查找并提取年份,然后打印出来
- 提取名称和排名数字,并输出结果
- 将姓名数据放入字典并输出
- 构建 [year, 'name rank', ... ] 列表并将其输出
- 修复了 main() 以使用 ExtractNames 列表
之前,我们的函数只是输出到标准输出。让函数 *返回* 提取的数据更具可重用性,这样调用方就可以选择输出这些数据或执行其他操作。(在开发过程中,您仍然可以直接从函数内部输出,以进行小型实验)。
使用 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”。这样可以一步生成所有摘要。( shell 的标准行为是,它会将“baby*.html”模式扩展为匹配的文件名列表,然后 shell 运行 Babynames.py,在 sys.argv 列表中传入所有这些文件名。)
将数据整理到摘要文件中后,您可以使用 shell 命令查看一段时间内的模式,如下所示:
$ grep 'Trinity ' *.summary $ grep 'Nick ' *.summary $ grep 'Miguel ' *.summary $ grep 'Emily ' *.summary
正则表达式提示 -- year: r'Popularity\sin\s(\d\d\d\d)'名称:r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'