html - 将给定 URL 中的 HTML 表格抓取到 CSV 中

标签 html language-agnostic parsing csv screen-scraping

我正在寻找一个可以像这样在命令行上运行的工具:

tablescrape 'http://someURL.foo.com' [n]

如果未指定n 并且页面上有多个HTML 表格,则应将它们(标题行、总行数)汇总在一个编号列表中。 如果指定了 n 或者如果只有一个表,它应该解析该表并将其作为 CSV 或 TSV 输出到标准输出。

潜在的附加功能:

  • 说真的,您可以在一个表中解析一个表,但就我的目的而言——从维基百科页面等获取数据——这太过分了。
  • 将任何 unicode 归类的选项。
  • 应用任意正则表达式替换以修复已解析表格中的怪异现象的选项。

你会用什么来拼凑这样的东西? Perl 模块 HTML::TableExtract可能是一个很好的起点,甚至可以处理嵌套表的情况。 这也可能是一个很短的 Python 脚本,带有 BeautifulSoup . 会 YQL是一个好的起点? 或者,理想情况下,您是否写过类似的东西并有指向它的指针? (我肯定不是第一个需要这个的人。)

相关问题:

最佳答案

这是我的第一次尝试:

http://yootles.com/outbox/tablescrape.py

它需要做更多的工作,比如更好的 asciifying,但它是可用的。例如,如果您将其指向此 list of Olympic records :

./tablescrape http://en.wikipedia.org/wiki/List_of_Olympic_records_in_athletics

它告诉你有 8 个表可用,很明显,第 2 和第 3 个(男子和女子记录)是你想要的:

1: [  1 cols,   1 rows] Contents 1 Men's rec
2: [  7 cols,  25 rows] Event | Record | Name | Nation | Games | Date | Ref
3: [  7 cols,  24 rows] Event | Record | Name | Nation | Games | Date | Ref
[...]

然后如果你再次运行它,请求第二个表,

./tablescrape http://en.wikipedia.org/wiki/List_of_Olympic_records_in_athletics 2

你得到一个合理的明文数据表:

100 metres | 9.69 | Usain Bolt | Jamaica (JAM) | 2008 Beijing | August 16, 2008 | [ 8 ]
200 metres | 19.30 | Usain Bolt | Jamaica (JAM) | 2008 Beijing | August 20, 2008 | [ 8 ]
400 metres | 43.49 | Michael Johnson | United States (USA) | 1996 Atlanta | July 29, 1996 | [ 9 ]
800 metres | 1:42.58 | Vebjørn Rodal | Norway (NOR) | 1996 Atlanta | July 31, 1996 | [ 10 ]
1,500 metres | 3:32.07 | Noah Ngeny | Kenya (KEN) | 2000 Sydney | September 29, 2000 | [ 11 ]
5,000 metres | 12:57.82 | Kenenisa Bekele | Ethiopia (ETH) | 2008 Beijing | August 23, 2008 | [ 12 ]
10,000 metres | 27:01.17 | Kenenisa Bekele | Ethiopia (ETH) | 2008 Beijing | August 17, 2008 | [ 13 ]
Marathon | 2:06:32 | Samuel Wanjiru | Kenya (KEN) | 2008 Beijing | August 24, 2008 | [ 14 ]
[...]

关于html - 将给定 URL 中的 HTML 表格抓取到 CSV 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2611418/

相关文章:

html - Flexbox/容器中的交替 float

java - 是否可以从 Servlet 填充下拉列表(在 HTML/JSP 中)?

language-agnostic - 可分发软件的版权和合理使用

language-agnostic - 纯度与引用透明度

c++ - 考虑多种情​​况,在 C++ 中解析英国用户的全名

javascript - 如何运行 index.jade 文件?

html - 调整大小超过最大宽度的表格单元格

将一个范围列表缩放到另一个范围的算法

c# - 为什么 double.TryParse ("0.0000", out doubleValue) 返回 false ?

c - 在C中通过标记读取字符串标记