这是一个很宽泛的问题,所以我的回答也很宽泛,只触及表面。
这一切都归结为两个步骤,(1) 从源中提取数据,以及 (2) 匹配和解析相关数据。
1a。从网络中提取数据
有很多方法可以从网络上抓取数据。根据源是 static 还是 dynamic,可以使用不同的策略。
如果数据在静态页面上,您可以下载所有页面的 HTML 源代码(自动,而不是手动),然后从 HTML 源代码中提取数据。可以使用多种不同的工具(使用多种不同的语言)下载 HTML 源代码,即使是简单的 wget 或 curl 也可以。
如果数据位于动态页面上(例如,如果数据位于某些表单后面,您需要执行数据库查询才能查看它),那么一个好的策略是使用自动网页抓取或测试工具。其中有很多。
请参阅此Automated Data Collection resources [1] 列表。如果您使用这样的工具,您可以立即提取数据,您通常没有将 HTML 源显式保存到磁盘然后解析它的中间步骤。
1b。从 PDF 中提取数据
首先尝试Tabula。它是一个开源 Web 应用程序,可让您直观地从 PDF 中提取表格数据。
如果您的 PDF 中的数据没有整齐地排列在简单的表格中,或者您有太多数据无法使用 Tabula,那么我建议使用 *NIX 命令行工具 pdftotext 来转换可移植文档格式 ( PDF) 文件转换为纯文本。
使用命令man pdftotext 查看该工具的手册页。一个有用的选项是-layout 选项,它试图在文本输出中保留原始布局。默认选项是“撤消”文档的物理布局,而是按阅读顺序输出文本。
1c。从电子表格中提取数据
尝试xls2text 转换为文本。
2。解析(HTML/文本)数据
对于解析数据,也有很多选项。例如,您可以使用grep 和sed 的组合,或者BeautifulSoup Python 库`,如果您正在处理 HTML 源代码,但不要将自己限制在这些选项中,您可以使用一种语言或您熟悉的工具。
当您解析和提取数据时,您实际上是在进行模式匹配。
寻找可以轻松隔离您所追求的数据的独特模式。
一种方法当然是正则表达式。假设我想从名为 file 的文本文件中提取电子邮件地址。
egrep -io "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b" file
上述命令将打印电子邮件地址 [2]。如果您想将它们保存到文件中,请将> filename 附加到命令的末尾。
[1] 请注意,此列表并非详尽的列表。它缺少许多选项。
[2] 这个正则表达式不是万无一失的,有一些极端情况它不会涵盖。
或者,您可以使用我创建的脚本,该脚本更适合从文本文件中提取电子邮件地址。它在查找电子邮件地址方面更准确,更易于使用,并且您可以一次传递多个文件。你可以在这里访问它:https://gist.github.com/dideler/5219706