如何将HTML表格转换为CSV?

如何将HTML表格( <table> )的内容转换为CSV格式? 有没有一个库或Linux程序这样做? 这与在Internet Explorer中复制表格类似,并将其粘贴到Excel中。

这种方法不是一个图书馆或一个程序,但是可以进行临时转换

  • 将表格的HTML放在名为something.xls文本文件中
  • 用电子表格打开它
  • 保存为CSV。

我知道这与Excel的工作,我相信我已经做了OpenOffice电子表格。

但你可能会喜欢Perl或Ruby脚本…

这是一个使用nokogiri的ruby脚本 – http://nokogiri.rubyforge.org/nokogiri/

 require 'nokogiri' doc = Nokogiri::HTML(table_string) doc.xpath('//table//tr').each do |row| row.xpath('td').each do |cell| print '"', cell.text.gsub("\n", ' ').gsub('"', '\"').gsub(/(\s){2,}/m, '\1'), "\", " end print "\n" end 

为我的基本testing案例工作。

对不起复活古代线程,但我最近想这样做,但我想要一个100%的便携式bash脚本来做到这一点。 所以这里是我的解决scheme只使用grep和sed。

下面是很快被淘汰,所以可以做得更加优雅,但我刚刚开始真正与sed / awk等…

 curl "http://www.webpagewithtableinit.com/" 2>/dev/null | grep -i -e '</\?TABLE\|</\?TD\|</\?TR\|</\?TH' | sed 's/^[\ \t]*//g' | tr -d '\n' | sed 's/<\/TR[^>]*>/\n/Ig' | sed 's/<\/\?\(TABLE\|TR\)[^>]*>//Ig' | sed 's/^<T[DH][^>]*>\|<\/\?T[DH][^>]*>$//Ig' | sed 's/<\/T[DH][^>]*><T[DH][^>]*>/,/Ig' 

正如你所看到的,我已经使用curl获得了页面源代码,但是你可以像从别的地方那样容易地input表格源代码。

这是解释:

使用cURL获取URL的内容,将stderr转储为空(无进度表)

 curl "http://www.webpagewithtableinit.com/" 2>/dev/null 

我只想要Table元素(只返回TABLE,TR,TH,TD标签的行)

 | grep -i -e '</\?TABLE\|</\?TD\|</\?TR\|</\?TH' 

删除行首的空格。

 | sed 's/^[\ \t]*//g' 

删除换行符

 | tr -d '\n\r' 

用换行符replace</TR>

 | sed 's/<\/TR[^>]*>/\n/Ig' 

删除TABLE和TR标签

 | sed 's/<\/\?\(TABLE\|TR\)[^>]*>//Ig' 

删除^<TD>^<TH></TD>$</TH>$

 | sed 's/^<T[DH][^>]*>\|<\/\?T[DH][^>]*>$//Ig' 

用逗号replace</TD><TD>

 | sed 's/<\/T[DH][^>]*><T[DH][^>]*>/,/Ig' 

请注意,如果任何表格单元格包含逗号,则可能需要先将其转义,或使用不同的分隔符。

希望这可以帮助别人!

我不确定是否有预制的库,但是如果你愿意用一个小小的Perl弄脏你的手,你可能会用Text::CSVHTML::Parser来做一些事情。

使用Perl,您可以使用HTML::TableExtract模块从表中提取数据,然后使用Text::CSV_XS创buildCSV文件或Spreadsheet::WriteExcel来创buildExcel文件。

假设你devise了一个包含表格的html页面,我会推荐这个解决scheme。 像我的魅力工作。

 $(document).ready(function() { $("#btnExport").click(function(e) { //getting values of current time for generating the file name var dt = new Date(); var day = dt.getDate(); var month = dt.getMonth() + 1; var year = dt.getFullYear(); var hour = dt.getHours(); var mins = dt.getMinutes(); var postfix = day + "." + month + "." + year + "_" + hour + "." + mins; //creating a temporary HTML link element (they support setting file names) var a = document.createElement('a'); //getting data from our div that contains the HTML table var data_type = 'data:application/vnd.ms-excel'; var table_div = document.getElementById('dvData'); var table_html = table_div.outerHTML.replace(/ /g, '%20'); a.href = data_type + ', ' + table_html; //setting the file name a.download = 'exported_table_' + postfix + '.xls'; //triggering the function a.click(); //just in case, prevent default behaviour e.preventDefault(); }); }); 

礼貌: http ://www.kubilayerdogan.net/?p= 218

您可以在这里将文件格式编辑为.csv a.download ='exported_table_'+ postfix +'.csv';

这是我写的一个简短的Python程序来完成这个任务。 这是在几分钟内写的,所以它可能会变得更好。 不知道如何处理嵌套表(可能会做坏的东西)或多个表(可能他们会一个接一个地出现)。 它不处理colspanrowspan 。 请享用。

 from HTMLParser import HTMLParser import sys import re class HTMLTableParser(HTMLParser): def __init__(self, row_delim="\n", cell_delim="\t"): HTMLParser.__init__(self) self.despace_re = re.compile(r'\s+') self.data_interrupt = False self.first_row = True self.first_cell = True self.in_cell = False self.row_delim = row_delim self.cell_delim = cell_delim def handle_starttag(self, tag, attrs): self.data_interrupt = True if tag == "table": self.first_row = True self.first_cell = True elif tag == "tr": if not self.first_row: sys.stdout.write(self.row_delim) self.first_row = False self.first_cell = True self.data_interrupt = False elif tag == "td" or tag == "th": if not self.first_cell: sys.stdout.write(self.cell_delim) self.first_cell = False self.data_interrupt = False self.in_cell = True def handle_endtag(self, tag): self.data_interrupt = True if tag == "td" or tag == "th": self.in_cell = False def handle_data(self, data): if self.in_cell: #if self.data_interrupt: # sys.stdout.write(" ") sys.stdout.write(self.despace_re.sub(' ', data).strip()) self.data_interrupt = False parser = HTMLTableParser() parser.feed(sys.stdin.read()) 

只是添加到这些答案(因为我最近一直在尝试类似的事情) – 如果谷歌电子表格是你select的电子表格程序。 简单地做这两件事。

1.表格中的所有内容从表格的开始/结束标签中除去,并将其另存为另一个html文件。

2.直接将html文件导入到Google电子表格中,并将您的信息精美地导入(顶部提示:如果您在表格中使用内联样式,则也会导入它们!)

节省了我的时间和搞清楚不同的转换。

基于audiodude的答案 ,但通过使用内置的CSV库进行简化

 require 'nokogiri' require 'csv' doc = Nokogiri::HTML(table_string) csv = CSV.open("output.csv", 'w') doc.xpath('//table//tr').each do |row| tarray = [] #temporary array row.xpath('td').each do |cell| tarray << cell.text #Build array of that row of data. end csv << tarray #Write that row out to csv file end csv.close 

我想知道是否有任何方法采取Nokogiri NodeSet( row.xpath('td') )并将其作为一个数组写入到csv文件中。 但我只能通过遍历每个单元格和构build每个单元格的内容的临时数组来做到这一点。

这里是一个使用pQuery和Spreadsheet :: WriteExcel的例子:

 use strict; use warnings; use Spreadsheet::WriteExcel; use pQuery; my $workbook = Spreadsheet::WriteExcel->new( 'data.xls' ); my $sheet = $workbook->add_worksheet; my $row = 0; pQuery( 'http://www.blahblah.site' )->find( 'tr' )->each( sub{ my $col = 0; pQuery( $_ )->find( 'td' )->each( sub{ $sheet->write( $row, $col++, $_->innerHTML ); }); $row++; }); $workbook->close; 

这个例子简单地提取所有find的excel文件中的tr标签。 您可以轻松地定制它来获取特定的表格 ,甚至触发每个表格标签的新的Excel文件。

更多的事情要考虑:

  • 你可能想拿起td标签来创buildexcel头文件。
  • 你可能会遇到rowspan和colspan的问题。

要查看是否正在使用rowspan或colspan,您可以:

 pQuery( $data )->find( 'td' )->each( sub{ my $number_of_cols_spanned = $_->getAttribute( 'colspan' ); }); 

这里有一个没有任何外部lib的简单解

https://www.codexworld.com/export-html-table-data-to-csv-using-javascript/

它适用于我没有任何问题

OpenOffice.org可以查看HTML表格。 只需在HTML文件上使用open命令,或者在浏览器中select并复制表格,然后在OpenOffice.org中selectPaste Special。 它会查询你的文件types,其中之一应该是HTML。 select那个和瞧!

这是一个非常古老的线索,但可能是像我这样的人会碰到它。 我已经做了一些额外的audiodude脚本从文件中读取html代替添加到代码,另一个参数控制标题行的打印。

脚本应该像这样运行

 ruby <script_name> <file_name> [<print_headers>] 

代码是:

 require 'nokogiri' print_header_lines = ARGV[1] File.open(ARGV[0]) do |f| table_string=f doc = Nokogiri::HTML(table_string) doc.xpath('//table//tr').each do |row| if print_header_lines row.xpath('th').each do |cell| print '"', cell.text.gsub("\n", ' ').gsub('"', '\"').gsub(/(\s){2,}/m, '\1'), "\", " end end row.xpath('td').each do |cell| print '"', cell.text.gsub("\n", ' ').gsub('"', '\"').gsub(/(\s){2,}/m, '\1'), "\", " end print "\n" end end 

这是基于primefaces模的答案,但更简洁,也处理th (标题)单元格以及td单元格。 我还添加了strip方法来摆脱多余的空格。

 CSV.open("output.csv", 'w') do |csv| doc.xpath('//table//tr').each do |row| csv << row.xpath('th|td').map {|cell| cell.text.strip} end end 

包装CSV块内的代码可确保文件将被正确closures。


如果你只是想要的文本,而不需要写入文件,你可以使用这个:

 doc.xpath('//table//tr').inject('') do |result, row| result << row.xpath('th|td').map {|cell| cell.text.strip}.to_csv end