Как я могу преобразовать HTML-таблицу в CSV?

Вы должны использовать decimal format и отформатировать номер.

DecimalFormat formatter = new DecimalFormat("#,###,###");
String yourFormattedString = formatter.format(100000);
System.out.println("$" + yourFormattedString);

Результат будет

-> 1,000,000 for 1000000         
-> 10,000 for 10000         
-> 1,000 for 1000
43
задан Brian Tompsett - 汤莱恩 1 January 2017 в 15:36
поделиться

8 ответов

Вот обновленная версия ответ Yuvai , который правильно обрабатывает поля, которые требуют заключения в кавычки (т.е. поля, которые содержат запятые в данных, двойные кавычки или охватывают несколько строк)

#!/usr/bin/env python3
from html.parser import HTMLParser
import sys
import re

class HTMLTableParser(HTMLParser):
    def __init__(self, row_delim="\n", cell_delim=","):
        HTMLParser.__init__(self)
        self.despace_re = re.compile("\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
        self.quote_buffer = False
        self.buffer = None

    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
        elif tag == "br":
            self.quote_buffer = True
            self.buffer += self.row_delim

    def handle_endtag(self, tag):
        self.data_interrupt = True
        if tag == "td" or tag == "th":
            self.in_cell = False
        if self.buffer != None:
            # Quote if needed...
            if self.quote_buffer or self.cell_delim in self.buffer or "\"" in self.buffer:
                # Need to quote! First, replace all double-quotes with quad-quotes
                self.buffer = self.buffer.replace("\"", "\"\"")
                self.buffer = "\"{0}\"".format(self.buffer)
            sys.stdout.write(self.buffer)
            self.quote_buffer = False
            self.buffer = None

    def handle_data(self, data):
        if self.in_cell:
            #if self.data_interrupt:
            #   sys.stdout.write(" ")
            if self.buffer == None:
                self.buffer = ""
            self.buffer += self.despace_re.sub(" ", data).strip()
            self.data_interrupt = False

parser = HTMLTableParser() 
parser.feed(sys.stdin.read())

, Одно улучшение для этого сценария могло быть должно добавить поддержку определения другого разделителя строки (или автоматически вычислить корректный платформой), и другой разделитель столбца.

0
ответ дан 26 November 2019 в 22:30
поделиться

Вот пример использования 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;

Пример просто извлекает все теги tr что он находит в файле Excel. Вы можете легко настроить его так, чтобы он выбирал конкретную таблицу или даже запускал новый файл Excel для тега table .

Дополнительные моменты, которые следует учитывать:

  • Возможно, вы захотите выбрать td теги для создания заголовка (ов) Excel.
  • И у вас могут быть проблемы с rowspan и colspan.

Чтобы узнать, используется ли rowspan или colspan, вы можете:

pQuery( $data )->find( 'td' )->each( sub{ 
    my $number_of_cols_spanned = $_->getAttribute( 'colspan' );
});
1
ответ дан 26 November 2019 в 22:30
поделиться

Этот метод на самом деле не является библиотекой ИЛИ программой, но для специальных преобразований вы можете

  • поместить HTML-код таблицы в текстовый файл с именем ] something.xls
  • открыть его с помощью электронной таблицы
  • сохранить как CSV.

Я знаю, что это работает с Excel, и я считаю, что сделал это с помощью электронной таблицы OpenOffice.

Но вы, вероятно, сделали бы это. предпочитаю Perl или Ruby скрипт ...

47
ответ дан 26 November 2019 в 22:30
поделиться

В Perl вы можете использовать модуль HTML :: TableExtract для извлечения данных из таблицы, а затем использовать Text :: CSV_XS для создания CSV-файл или Spreadsheet :: WriteExcel для создания файла Excel.

5
ответ дан 26 November 2019 в 22:30
поделиться

Вот сценарий ruby, который использует nokogiri - 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

Работал для моего базового теста.

19
ответ дан 26 November 2019 в 22:30
поделиться

Я не уверен, есть ли для этого готовая библиотека, но если вы готовы запачкать руки небольшим Perl, вы, вероятно, могли бы что-то сделать с Text :: CSV и HTML :: Parser .

6
ответ дан 26 November 2019 в 22:30
поделиться

OpenOffice.org может просматривать таблицы HTML. Просто используйте команду Open в файле HTML или выберите и скопируйте таблицу в браузере, а затем вставьте специальные в OpenOffice.org. Это запрашивает вас для типа файла, один из которых должен быть HTML. Выберите это и вуаля!

1
ответ дан 26 November 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: