Как я могу очистить таблицу HTML до CSV? - PullRequest
39 голосов
/ 03 ноября 2008

Проблема

Я использую инструмент на работе, который позволяет мне выполнять запросы и возвращать HTML-таблицы с информацией. У меня нет никакого внутреннего доступа к нему.

Большая часть этой информации была бы гораздо полезнее, если бы я мог поместить ее в электронную таблицу для сортировки, усреднения и т. Д. Как я могу отсканировать эти данные в файл CSV?

Моя первая идея

Так как я знаю jQuery, я подумал, что мог бы использовать его для вырезания форматирования таблицы на экране, вставки запятых и разрывов строк, а также просто скопировать весь беспорядок в блокнот и сохранить как CSV. Есть идеи получше?

Решение

Да, ребята, это действительно было так же просто, как копировать и вставлять. Разве я не чувствую себя глупо.

В частности, когда я вставил в электронную таблицу, мне пришлось выбрать «Специальная вставка» и выбрать формат «текст». В противном случае он попытался вставить все в одну ячейку, даже если я выделил всю таблицу.

Ответы [ 11 ]

33 голосов
/ 03 ноября 2008
  • Выберите таблицу HTML в пользовательском интерфейсе инструментов и скопируйте ее в буфер обмена (если это возможно
  • Вставьте его в Excel.
  • Сохранить как файл CSV

Однако это ручное решение, а не автоматизированное.

12 голосов
/ 11 ноября 2008

с использованием Python:

например, представьте, что вы хотите очистить котировки форекс в форме csv с какого-либо сайта, например: fxquotes

тогда ...

<code>from BeautifulSoup import BeautifulSoup
import urllib,string,csv,sys,os
from string import replace

date_s = '&date1=01/01/08'
date_f = '&date=11/10/08'
fx_url = 'http://www.oanda.com/convert/fxhistory?date_fmt=us'
fx_url_end = '&lang=en&margin_fixed=0&format=CSV&redirected=1'
cur1,cur2 = 'USD','AUD'
fx_url = fx_url + date_f + date_s + '&exch=' + cur1 +'&exch2=' + cur1
fx_url = fx_url +'&expr=' + cur2 +  '&expr2=' + cur2 + fx_url_end
data = urllib.urlopen(fx_url).read()
soup = BeautifulSoup(data)
data = str(soup.findAll('pre', limit=1))
data = replace(data,'[<pre>','')
data = replace(data,'
]», '') file_location = '/ Users / location_edit_this' имя_файла = расположение_файла + 'usd_aus.csv' file = open (имя_файла, "w") file.write (данные) file.close ()

edit: чтобы получить значения из таблицы: пример из: Палевир

from mechanize import Browser
from BeautifulSoup import BeautifulSoup

mech = Browser()

url = "http://www.palewire.com/scrape/albums/2007.html"
page = mech.open(url)

html = page.read()
soup = BeautifulSoup(html)

table = soup.find("table", border=1)

for row in table.findAll('tr')[1:]:
    col = row.findAll('td')

    rank = col[0].string
    artist = col[1].string
    album = col[2].string
    cover_link = col[3].img['src']

    record = (rank, artist, album, cover_link)
    print "|".join(record)
10 голосов
/ 22 мая 2013

Это моя версия на Python, использующая (в настоящее время) последнюю версию BeautifulSoup, которую можно получить, например,

$ sudo easy_install beautifulsoup4

Скрипт читает HTML из стандартного ввода и выводит текст, найденный во всех таблицах, в правильном формате CSV.

#!/usr/bin/python
from bs4 import BeautifulSoup
import sys
import re
import csv

def cell_text(cell):
    return " ".join(cell.stripped_strings)

soup = BeautifulSoup(sys.stdin.read())
output = csv.writer(sys.stdout)

for table in soup.find_all('table'):
    for row in table.find_all('tr'):
        col = map(cell_text, row.find_all(re.compile('t[dh]')))
        output.writerow(col)
    output.writerow([])
5 голосов
/ 11 ноября 2008

Еще проще (потому что это сохранит для тебя в следующий раз) ...

В Excel

Данные / Импорт внешних данных / Новый веб-запрос

приведет вас к приглашению URL. Введите ваш URL, и он будет ограничивать доступные таблицы на странице для импорта. Вуаля.

4 голосов
/ 22 января 2015

На ум приходят два способа (особенно для тех из нас, у кого нет Excel):

2 голосов
/ 26 марта 2015

Базовая реализация Python с использованием BeautifulSoup, также учитывающая как rowspan, так и colspan:

from BeautifulSoup import BeautifulSoup

def table2csv(html_txt):
   csvs = []
   soup = BeautifulSoup(html_txt)
   tables = soup.findAll('table')

   for table in tables:
       csv = ''
       rows = table.findAll('tr')
       row_spans = []
       do_ident = False

       for tr in rows:
           cols = tr.findAll(['th','td'])

           for cell in cols:
               colspan = int(cell.get('colspan',1))
               rowspan = int(cell.get('rowspan',1))

               if do_ident:
                   do_ident = False
                   csv += ','*(len(row_spans))

               if rowspan > 1: row_spans.append(rowspan)

               csv += '"{text}"'.format(text=cell.text) + ','*(colspan)

           if row_spans:
               for i in xrange(len(row_spans)-1,-1,-1):
                   row_spans[i] -= 1
                   if row_spans[i] < 1: row_spans.pop()

           do_ident = True if row_spans else False

           csv += '\n'

       csvs.append(csv)
       #print csv

   return '\n\n'.join(csvs)
2 голосов
/ 11 ноября 2008

Excel может открыть страницу http.

Например:

  1. Нажмите Файл, Открыть

  2. Под именем файла вставьте URL, например: Как я могу очистить таблицу HTML до CSV?

  3. Нажмите ОК

Excel делает все возможное, чтобы преобразовать HTML в таблицу.

Это не самое элегантное решение, но оно работает!

2 голосов
/ 03 ноября 2008

Быстро и грязно:

Скопируйте из браузера в Excel, сохраните как CSV.

Лучшее решение (для длительного использования):

Напишите немного кода на выбранном вами языке, который снесет содержимое html и вычистит нужные вам биты. Вы могли бы, вероятно, добавить все операции с данными (сортировка, усреднение и т. Д.) Поверх поиска данных. Таким образом, вам просто нужно запустить свой код и получить нужный отчет.

Все зависит от того, как часто вы будете выполнять эту задачу.

1 голос
/ 13 апреля 2017

Вот пример протестированный , который сочетает в себе grequeest и суп для загрузки большого количества страниц со структурированного веб-сайта:

#!/usr/bin/python

from bs4 import BeautifulSoup
import sys
import re
import csv
import grequests
import time

def cell_text(cell):
    return " ".join(cell.stripped_strings)

def parse_table(body_html):
    soup = BeautifulSoup(body_html)
    for table in soup.find_all('table'):
        for row in table.find_all('tr'):
            col = map(cell_text, row.find_all(re.compile('t[dh]')))
            print(col)

def process_a_page(response, *args, **kwargs): 
    parse_table(response.content)

def download_a_chunk(k):
    chunk_size = 10 #number of html pages
    x = "http://www.blahblah....com/inclusiones.php?p="
    x2 = "&name=..."
    URLS = [x+str(i)+x2 for i in range(k*chunk_size, k*(chunk_size+1)) ]
    reqs = [grequests.get(url, hooks={'response': process_a_page}) for url in URLS]
    resp = grequests.map(reqs, size=10)

# download slowly so the server does not block you
for k in range(0,500):
    print("downloading chunk ",str(k))
    download_a_chunk(k)
    time.sleep(11)
0 голосов
/ 03 ноября 2008

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

...