如何将HTML表格转换为CSV?

43 html csv html-table

如何将HTML表格(<table>)的内容转换为CSV格式?是否有库或linux程序执行此操作?这类似于Internet Explorer中的复制表,并将它们粘贴到Excel中.

pav*_*ium 47

这种方法实际上不是库或程序,但对于临时转换,您可以

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

我知道这适用于Excel,我相信我已经使用OpenOffice电子表格完成了它.

但你可能更喜欢Perl或Ruby脚本......

  • 相关:在网络浏览器中选择表格数据并**复制**。打开仅处理纯文本的编辑器,例如 Notepad.exe 或 BBEdit.app 和 **Paste**。将文档另存为 *.csv*。它可能是制表符分隔的,因此您可以在电子表格应用程序中打开它并导出为格式正确的 CSV。 (3认同)

小智 21

很抱歉复活一个古老的线程,但我最近想要这样做,但我想要一个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'
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我使用curl获得了页面源代码,但您可以轻松地从其他地方输入表源代码.

这是解释:

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

curl "http://www.webpagewithtableinit.com/" 2>/dev/null 
Run Code Online (Sandbox Code Playgroud)

.

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

| grep -i -e '</\?TABLE\|</\?TD\|</\?TR\|</\?TH'
Run Code Online (Sandbox Code Playgroud)

.

删除行开头的任何空格.

| sed 's/^[\ \t]*//g' 
Run Code Online (Sandbox Code Playgroud)

.

删除换行符

| tr -d '\n\r' 
Run Code Online (Sandbox Code Playgroud)

.

替换</TR>为换行符

| sed 's/<\/TR[^>]*>/\n/Ig'  
Run Code Online (Sandbox Code Playgroud)

.

删除TABLE和TR标记

| sed 's/<\/\?\(TABLE\|TR\)[^>]*>//Ig' 
Run Code Online (Sandbox Code Playgroud)

.

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

| sed 's/^<T[DH][^>]*>\|<\/\?T[DH][^>]*>$//Ig' 
Run Code Online (Sandbox Code Playgroud)

.

替换</TD><TD>为逗号

| sed 's/<\/T[DH][^>]*><T[DH][^>]*>/,/Ig'
Run Code Online (Sandbox Code Playgroud)

.

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

希望这有助于某人!


aud*_*ude 19

这是一个使用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
Run Code Online (Sandbox Code Playgroud)

为我的基本测试用例工作.


Yuv*_*val 9

这是我编写的一个简短的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()) 
Run Code Online (Sandbox Code Playgroud)


Chr*_*ons 6

我不确定是否有预制的库,但如果你愿意用一点Perl弄脏你的话,你很可能会用Text::CSV和做一些事情HTML::Parser.


jmc*_*ara 5

使用Perl,您可以使用该HTML::TableExtract模块从表中提取数据,然后使用Text::CSV_XS创建CSV文件或Spreadsheet::WriteExcel创建Excel文件.


Bha*_*ath 5

Assuming that u've designed an html page containing a table I would recommend this solution. Worked like charm for me.

$(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();
});
});
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

只是为了增加这些答案(就像我最近一直在尝试类似的事情)-如果Google电子表格是您选择的电子表格程序。简单地做这两件事。

1.将所有内容从Table开/闭标签周围的html文件中剥离,并将其重新保存为另一个html文件。

2.直接将该html文件导入到Google电子表格中,您将可以精美地导入您的信息(最重要的提示:如果您在表中使用了内联样式,它们也将被导入!)

节省了我很多时间,并节省了转换的时间。


Met*_*ani 5

这是一个没有任何外部库的简单解决方案:

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

它对我有用,没有任何问题


Ben*_* W. 5

这是使用pupjq的方法。

假设infile.html包含一个<table>元素,我们可以使用 pup 选择其行,并转换为 JSON:

pup 'table tr json{}' --file infile.html
Run Code Online (Sandbox Code Playgroud)

这将返回一个对象数组,children每行都有一个数组。对于具有标题行、两个数据行和三列的示例:

[
 {
  "children": [
   { "tag": "th", "text": "ID" },
   { "tag": "th", "text": "First name" },
   { "tag": "th", "text": "Last name" }
  ],
  "tag": "tr"
 },
 {
  "children": [
   { "tag": "td", "text": "123" },
   { "tag": "td", "text": "Anna" },
   { "tag": "td", "text": "Alphabet" }
  ],
  "tag": "tr"
 },
 {
  "children": [
   { "tag": "td", "text": "456" },
   { "tag": "td", "text": "Brandon" },
   { "tag": "td", "text": "Betazoid" }
  ],
  "tag": "tr"
 }
]
Run Code Online (Sandbox Code Playgroud)

要将其转换为 CSV,我们可以使用 jq (参见代码片段):

pup 'table tr json{}' --file infile.html \
    | jq --raw-output 'map(.children | map(.text))[] | @csv'
Run Code Online (Sandbox Code Playgroud)

导致

"ID","First name","Last name"
"123","Anna","Alphabet"
"456","Brandon","Betazoid"
Run Code Online (Sandbox Code Playgroud)