Как я могу преобразовать таблицу HTML в CSV? - PullRequest
41 голосов
/ 10 сентября 2009

Как мне преобразовать содержимое таблицы HTML (<table>) в формат CSV? Есть ли библиотека или программа Linux, которая делает это? Это похоже на копирование таблиц в Internet Explorer и вставку их в Excel.

Ответы [ 15 ]

2 голосов
/ 04 декабря 2014

Это очень старая тема, но, может быть, кто-то вроде меня столкнется с ней. Я сделал несколько дополнений для скрипта 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
1 голос
/ 01 февраля 2016

Это основано на ответе atomicules , но более кратко и также обрабатывает 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
1 голос
/ 22 января 2010

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

1 голос
/ 10 сентября 2009

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