Очистить таблицы HTML с данного URL в CSV - PullRequest
4 голосов
/ 10 апреля 2010

Я ищу инструмент, который можно запустить в командной строке следующим образом:

tablescrape 'http://someURL.foo.com' [n]

Если n не указан и на странице более одной таблицы HTML, их следует суммировать (строка заголовка, общее количество строк) в нумерованном списке.Если указано n или имеется только одна таблица, она должна проанализировать таблицу и выплюнуть ее в стандартный вывод как CSV или TSV.

Потенциальные дополнительные функции:

  • Чтобы быть действительноПредставьте, что вы можете анализировать таблицу внутри таблицы, но для моих целей - выборка данных со страниц Википедии и т. д. - это излишне.
  • Возможность указать любой юникод.
  • Параметрприменить произвольную замену регулярных выражений для исправления странностей в разобранной таблице.

Что бы вы использовали, чтобы сделать что-то подобное вместе?Модуль Perl HTML :: TableExtract может быть хорошим местом для начала и может даже обрабатывать случай вложенных таблиц.Это также может быть довольно короткий скрипт на Python с BeautifulSoup . YQL будет хорошей отправной точкой?Или, в идеале, вы написали нечто подобное и имеете указатель на это?(Я, конечно, не первый человек, которому это нужно.)

Вопросы, связанные с данной:

Ответы [ 2 ]

13 голосов
/ 12 апреля 2010

Это моя первая попытка:

http://yootles.com/outbox/tablescrape.py

Требуется немного больше работы, как, например, улучшенная окраска, но ее можно использовать. Например, если вы укажете это на список олимпийских рекордов :

./tablescrape http://en.wikipedia.org/wiki/List_of_Olympic_records_in_athletics

он говорит вам, что доступно 8 таблиц, и ясно, что вам нужны 2-я и 3-я (записи для мужчин и женщин):

1: [  1 cols,   1 rows] Contents 1 Men's rec
2: [  7 cols,  25 rows] Event | Record | Name | Nation | Games | Date | Ref
3: [  7 cols,  24 rows] Event | Record | Name | Nation | Games | Date | Ref
[...]

Тогда, если вы запустите его снова, запрашивая 2-ую таблицу,

./tablescrape http://en.wikipedia.org/wiki/List_of_Olympic_records_in_athletics 2

Вы получаете разумную таблицу данных в виде открытого текста:

100 metres | 9.69 | Usain Bolt | Jamaica (JAM) | 2008 Beijing | August 16, 2008 | [ 8 ]
200 metres | 19.30 | Usain Bolt | Jamaica (JAM) | 2008 Beijing | August 20, 2008 | [ 8 ]
400 metres | 43.49 | Michael Johnson | United States (USA) | 1996 Atlanta | July 29, 1996 | [ 9 ]
800 metres | 1:42.58 | Vebjørn Rodal | Norway (NOR) | 1996 Atlanta | July 31, 1996 | [ 10 ]
1,500 metres | 3:32.07 | Noah Ngeny | Kenya (KEN) | 2000 Sydney | September 29, 2000 | [ 11 ]
5,000 metres | 12:57.82 | Kenenisa Bekele | Ethiopia (ETH) | 2008 Beijing | August 23, 2008 | [ 12 ]
10,000 metres | 27:01.17 | Kenenisa Bekele | Ethiopia (ETH) | 2008 Beijing | August 17, 2008 | [ 13 ]
Marathon | 2:06:32 | Samuel Wanjiru | Kenya (KEN) | 2008 Beijing | August 24, 2008 | [ 14 ]
[...]
1 голос
/ 23 апреля 2010

Используя TestPlan Я создал грубый скрипт. Учитывая сложность веб-таблиц, их, вероятно, нужно будет адаптировать ко всем сайтам.

Этот первый скрипт перечисляет таблицы на странице:

# A simple table scraping example. It lists the tables on a page
#
# Cmds.Site = the URL to scan
default %Cmds.Site% http://en.wikipedia.org/wiki/List_of_Olympic_records_in_athletics
GotoURL %Cmds.Site%

set %Count% 1
foreach %Table% in (response //table)
    Notice Table #%Count%
    # find a suitable name, look back for a header
    set %Check% ./preceding::*[name()='h1' or name()='h2' or name()='h3'][1]
    if checkIn %Table% %Check%
        Notice (selectIn %Table% %Check%)
    end

    set %Count% as binOp %Count% + 1
end

Затем второй сценарий извлекает данные одной таблицы в файл CSV.

# Generic extract of contents of a table in a webpage
# Use list_tables to get the list of table and indexes
#
# Cmds.Site = the URL to scan
# Cmds.Index = Table index to scan
default %Cmds.Site% http://en.wikipedia.org/wiki/List_of_Olympic_records_in_athletics
default %Cmds.Index% 2

GotoURL %Cmds.Site%

set %Headers% //table[%Cmds.Index%]/tbody/tr[1]
set %Rows% //table[%Cmds.Index%]/tbody/tr[position()>1]

# Get an cleanup the header fields 
set %Fields% withvector
end
foreach %Header% in (response %Headers%/*)
    putin %Fields% (trim %Header%)
end
Notice %Fields%

# Create an output CSV
call unit.file.CreateDataFile with
    %Name% %This:Dir%/extract_table.csv
    %Format% csv
    %Fields% %Fields%
end
set %DataFile% %Return:Value%

# Now extract each row
foreach %Row% in (response %Rows%)
    set %Record% withvector
    end
    foreach %Cell% in (selectIn %Row% ./td)
        putin %Record% (trim %Cell%)
    end

    call unit.file.WriteDataFile with
        %DataFile% %DataFile%
        %Record% %Record%
    end
end

call unit.file.CloseDataFile with
    %DataFile% %DataFile%
end

Мой CSV-файл выглядит следующим образом. Обратите внимание, что в Википедии есть извлечение информации в каждой ячейке. Есть много способов избавиться от этого, но не в общем виде.

Shot put,22.47 m,"Timmermann, UlfUlf Timmermann",East Germany (GDR),1988 1988 Seoul,"01988-09-23 September 23, 1988",[25]
Discus throw,69.89 m,"Alekna, VirgilijusVirgilijus Alekna",Lithuania (LTU),2004 2004 Athens,"02004-08-23 August 23, 2004",[26]
Hammer throw,84.80 m,"Litvinov, SergeySergey Litvinov",Soviet Union (URS),1988 1988 Seoul,"01988-09-26 September 26, 1988",[27]
Javelin throw,90.57 m,"Thorkildsen, AndreasAndreas Thorkildsen",Norway (NOR),2008 2008 Beijing,"02008-08-23 August 23, 2008",[28]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...