如何將HTML表格轉換為CSV?




html to csv file (12)

這是一個沒有任何外部庫的簡單解決方案

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

它對我有用,沒有任何問題

如何將HTML表格( <table> )的內容轉換為CSV格式? 是否有庫或linux程序執行此操作? 這類似於Internet Explorer中的複製表,並將它們粘貼到Excel中。


Answer #1

這是一個非常古老的主題,但也許像我這樣的人會碰到它。 我為的腳本添加了一些內容,用於從文件中讀取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

Answer #2

只是為了添加這些答案(因為我最近嘗試過類似的事情) - 如果Google電子表格是您選擇的電子投影程序。 簡單地做這兩件事。

1.表格打開/關閉標籤周圍的html文件中刪除所有內容,並將其重新保存為另一個html文件。

2.將該html文件直接導入到Google電子表格中,您將獲得精美導入的信息(最重要提示:如果您在表格中使用了內聯樣式,它們也會被導入!)

節省了大量時間併計算出不同的轉換次數。


Answer #3

這是基於原子彈的答案,但更簡潔,並且還處理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塊中可確保正確關閉文件。

如果您只是想要文本而不需要將其寫入文件,則可以使用:

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

Answer #4

很抱歉復活了一個古老的線程,但我最近想要這樣做,但我想要一個100%可移植的bash腳本來做到這一點。 所以這是我的解決方案,只使用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獲得了頁面源,但您可以輕鬆地從其他地方輸入表源。

這是解釋:

使用cURL獲取URL的內容,將stderr轉儲為null(無進度表)

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' 

用換行符替換</TR>

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

刪除TABLE和TR標記

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

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

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

用逗號替換</TD><TD>

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

請注意,如果任何表格單元格包含逗號,您可能需要先將它們轉義,或使用不同的分隔符。

希望這有助於某人!


Answer #5

這是一個使用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

為我的基本測試用例工作。


Answer #6

基於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文件中。 但我只能通過迭代每個單元格並構建每個單元格內容的臨時數組來解決這個問題。


Answer #7

假設你已經設計了一個包含表格的html頁面,我會推薦這個解決方案。 對我來說就像魅力一樣。

$(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 ://www.kubilayerdogan.net/?p = http://www.kubilayerdogan.net/?p=218

您可以在此處將文件格式編輯為.csv a.download ='exported_table_'+ postfix +'.csv';


Answer #8

以下是使用pQuerySpreadsheet::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;

該示例只是將它找到的所有tr標記提取到excel文件中。 您可以輕鬆地定制它以獲取特定的 ,甚至可以為每個標記觸發新的Excel文件。

還需要考慮的事項:

  • 您可能想要選擇td標籤來創建excel標頭。
  • 你可能會遇到rowspan和colspan的問題。

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

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

Answer #9

這種方法實際上不是庫或程序,但對於臨時轉換,您可以

  • 將表格的HTML放在名為something.xls文本文件中
  • 用電子表格打開它
  • 將其另存為CSV。

我知道這適用於Excel,我相信我已經使用OpenOffice電子表格完成了它。

但你可能更喜歡Perl或Ruby腳本......



Answer #11

我不確定是否有預製的庫,但是如果你願意用一點Perl弄髒你,你可能會對Text::CSVHTML::Parser做些什麼。





html-table