我怎样才能把一个HTML表格CSV?

问题

我在工作中使用了一个工具,可以让我查询信息并获取HTML表格。 我没有任何types的后端访问。

如果我可以把它放到一个电子表格中进行sorting,平均等,那么很多这种信息会更加有用。 如何将这些数据屏幕抓取到CSV文件?

我的第一个想法

因为我知道jQuery,所以我想我可以用它去掉屏幕上的表格格式,插入逗号和换行符,然后把整个文件复制到记事本中并保存为CSV。 任何更好的想法?

解决scheme

是的,伙计们,就像复制和粘贴一样简单。 我不觉得傻。

具体来说,当我粘贴到电子表格中时,我必须select“select性粘贴”并select格式“文本”。 否则,它会尝试将所有内容粘贴到一个单元格中,即使我突出显示了整个电子表格。

  • 在工具的用户界面中selectHTML表格,并将其复制到剪贴板(如果可能的话)
  • 将其粘贴到Excel中。
  • 另存为CSV文件

但是,这是手动解决scheme,而不是自动解决scheme。

使用python:

例如想象你想从csvforms从一些网站,如fxquotes刮外汇报价

然后…

 from BeautifulSoup import BeautifulSoup import urllib,string,csv,sys,os from string import replace date_s = '&date1=01/01/08' date_f = '&date=11/10/08' fx_url = 'http://www.oanda.com/convert/fxhistory?date_fmt=us' fx_url_end = '&lang=en&margin_fixed=0&format=CSV&redirected=1' cur1,cur2 = 'USD','AUD' fx_url = fx_url + date_f + date_s + '&exch=' + cur1 +'&exch2=' + cur1 fx_url = fx_url +'&expr=' + cur2 + '&expr2=' + cur2 + fx_url_end data = urllib.urlopen(fx_url).read() soup = BeautifulSoup(data) data = str(soup.findAll('pre', limit=1)) data = replace(data,'[<pre>','') data = replace(data,'</pre>]','') file_location = '/Users/location_edit_this' file_name = file_location + 'usd_aus.csv' file = open(file_name,"w") file.write(data) file.close() 

编辑:从表中获取值: palewire的例子

 from mechanize import Browser from BeautifulSoup import BeautifulSoup mech = Browser() url = "http://www.palewire.com/scrape/albums/2007.html" page = mech.open(url) html = page.read() soup = BeautifulSoup(html) table = soup.find("table", border=1) for row in table.findAll('tr')[1:]: col = row.findAll('td') rank = col[0].string artist = col[1].string album = col[2].string cover_link = col[3].img['src'] record = (rank, artist, album, cover_link) print "|".join(record) 

这是我使用BeautifulSoup(当前)最新版本的python版本,可以使用(例如)

 $ sudo easy_install beautifulsoup4 

该脚本从标准input中读取HTML,并以适当的CSV格式输出所有表格中的文本。

 #!/usr/bin/python from bs4 import BeautifulSoup import sys import re import csv def cell_text(cell): return " ".join(cell.stripped_strings) soup = BeautifulSoup(sys.stdin.read()) output = csv.writer(sys.stdout) for table in soup.find_all('table'): for row in table.find_all('tr'): col = map(cell_text, row.find_all(re.compile('t[dh]'))) output.writerow(col) output.writerow([]) 

更容易(因为它为您节省下次)…

在Excel中

数据/导入外部数据/新buildWeb查询

会带你到一个URL提示。 input您的url,它将界定页面上的可用表格以导入。 瞧。

想到两种方法(特别是对于我们这些没有Excel的人):

  • Google电子表格有一个很好的importHTML函数 :
    • =importHTML("http://example.com/page/with/table", "table", index
    • 索引从1开始
    • 我build议在导入后立即copypaste values
    • 文件 – >下载为 – > CSV
  • Python的超级pandas库有方便的read_htmlto_csv函数
    • 以下是一个基本的Python3脚本 ,提示inputURL,该URL的哪个表格以及CSV的文件名。

快速和肮脏:

将浏览器复制到Excel中,另存为CSV。

更好的解决scheme(长期使用):

用你select的语言编写一些代码,将HTML内容拉下来,并刮掉你想要的位。 你可能会抛出所有的数据操作(sorting,平均等)在数据检索之上。 这样,你只需运行你的代码,你就可以得到你想要的实际报告。

这一切都取决于你将多久执行一次这个特定的任务。

Excel可以打开一个http页面。

例如:

  1. 点击文件,打开

  2. 在文件名下,粘贴url即: 我怎样才能把一个HTML表格CSV?

  3. 点击确定

Excel尽力将html转换为表格。

它不是最优雅的解决scheme,但工作!

使用BeautifulSoup的基本Python实现,同时考虑rowspan和colspan:

 from BeautifulSoup import BeautifulSoup def table2csv(html_txt): csvs = [] soup = BeautifulSoup(html_txt) tables = soup.findAll('table') for table in tables: csv = '' rows = table.findAll('tr') row_spans = [] do_ident = False for tr in rows: cols = tr.findAll(['th','td']) for cell in cols: colspan = int(cell.get('colspan',1)) rowspan = int(cell.get('rowspan',1)) if do_ident: do_ident = False csv += ','*(len(row_spans)) if rowspan > 1: row_spans.append(rowspan) csv += '"{text}"'.format(text=cell.text) + ','*(colspan) if row_spans: for i in xrange(len(row_spans)-1,-1,-1): row_spans[i] -= 1 if row_spans[i] < 1: row_spans.pop() do_ident = True if row_spans else False csv += '\n' csvs.append(csv) #print csv return '\n\n'.join(csvs) 

这是一个经过testing的例子,结合了grequest和汤,从结构化的网站下载大量的页面:

 #!/usr/bin/python from bs4 import BeautifulSoup import sys import re import csv import grequests import time def cell_text(cell): return " ".join(cell.stripped_strings) def parse_table(body_html): soup = BeautifulSoup(body_html) for table in soup.find_all('table'): for row in table.find_all('tr'): col = map(cell_text, row.find_all(re.compile('t[dh]'))) print(col) def process_a_page(response, *args, **kwargs): parse_table(response.content) def download_a_chunk(k): chunk_size = 10 #number of html pages x = "http://www.blahblah....com/inclusiones.php?p=" x2 = "&name=..." URLS = [x+str(i)+x2 for i in range(k*chunk_size, k*(chunk_size+1)) ] reqs = [grequests.get(url, hooks={'response': process_a_page}) for url in URLS] resp = grequests.map(reqs, size=10) # download slowly so the server does not block you for k in range(0,500): print("downloading chunk ",str(k)) download_a_chunk(k) time.sleep(11) 

你有没有尝试用Excel打开它? 如果您将excel中的电子表格保存为html,您将看到excel使用的格式。 从我写的一个Web应用程序,我吐出这个HTML格式,所以用户可以导出到Excel。

如果你正在屏幕抓取,而你要转换的表有一个给定的ID,你总是可以做一个正则expression式parsing的HTML和一些脚本生成一个CSV。