43 html csv html-table
如何将HTML表格(<table>)的内容转换为CSV格式?是否有库或linux程序执行此操作?这类似于Internet Explorer中的复制表,并将它们粘贴到Excel中.
pav*_*ium 47
这种方法实际上不是库或程序,但对于临时转换,您可以
我知道这适用于Excel,我相信我已经使用OpenOffice电子表格完成了它.
但你可能更喜欢Perl或Ruby脚本......
小智 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)
为我的基本测试用例工作.
这是我编写的一个简短的Python程序来完成这项任务.它是在几分钟内编写的,所以它可能会变得更好.不确定它将如何处理嵌套表(可能它会做坏事)或多个表(可能它们只是一个接一个地出现).它没有处理colspan或rowspan.请享用.
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)
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电子表格中,您将可以精美地导入您的信息(最重要的提示:如果您在表中使用了内联样式,它们也将被导入!)
节省了我很多时间,并节省了转换的时间。
这是一个没有任何外部库的简单解决方案:
https://www.codexworld.com/export-html-table-data-to-csv-using-javascript/
它对我有用,没有任何问题
假设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)