将HTML表从给定的URL刮到CSV

dre*_*ves 4 html language-agnostic csv parsing screen-scraping

我寻找一个可以在命令行上运行的工具,如下所示:

tablescrape 'http://someURL.foo.com' [n]
Run Code Online (Sandbox Code Playgroud)

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

潜在的附加功能:

  • 真的很花哨你可以在一个表中解析一个表,但是为了我的目的 - 从维基百科页面中获取数据等 - 这太过分了.
  • asciify任何unicode的选项.
  • 应用任意正则表达式替换来修复已解析表中的奇怪现象的选项.

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

相关问题:

dre*_*ves 13

这是我的第一次尝试:

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

它需要更多的工作,比如更好的asciifying,但它是可用的.例如,如果您将其指向此奥运会记录列表:

./tablescrape http://en.wikipedia.org/wiki/List_of_Olympic_records_in_athletics
Run Code Online (Sandbox Code Playgroud)

它告诉你有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
[...]
Run Code Online (Sandbox Code Playgroud)

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

./tablescrape http://en.wikipedia.org/wiki/List_of_Olympic_records_in_athletics 2
Run Code Online (Sandbox Code Playgroud)

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

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 ]
[...]
Run Code Online (Sandbox Code Playgroud)