44 Stimmen

Wie kann ich eine HTML-Tabelle in eine CSV-Datei umwandeln?

Das Problem

Ich verwende bei der Arbeit ein Tool, mit dem ich Abfragen durchführen und HTML-Tabellen mit Informationen zurückerhalten kann. Ich habe keine Art von Back-End-Zugang zu diesem Tool.

Viele dieser Informationen wären sehr viel nützlicher, wenn ich sie in eine Tabelle eingeben könnte, um sie zu sortieren, Mittelwerte zu bilden usw. Wie kann ich diese Daten in eine CSV-Datei einlesen?

Meine erste Idee

Da ich mich mit jQuery auskenne, dachte ich, ich könnte damit die Tabellenformatierung auf dem Bildschirm entfernen, Kommas und Zeilenumbrüche einfügen und das ganze Durcheinander einfach in Notepad kopieren und als CSV-Datei speichern. Haben Sie eine bessere Idee?

Die Lösung

Ja, Leute, es war wirklich so einfach wie Kopieren und Einfügen. Komme ich mir nicht dumm vor?

Insbesondere musste ich beim Einfügen in das Arbeitsblatt die Option "Einfügen spezial" wählen und das Format "Text" auswählen. Andernfalls wurde versucht, alles in eine einzige Zelle einzufügen, auch wenn ich das gesamte Arbeitsblatt markiert hatte.

2voto

James Van Huis Punkte 5397

Schnell und schmutzig:

Aus dem Browser in Excel kopieren, als CSV speichern.

Bessere Lösung (für den langfristigen Einsatz):

Schreiben Sie einen Code in einer Sprache Ihrer Wahl, der den Html-Inhalt nach unten zieht und die gewünschten Teile herauskratzen kann. Sie könnten wahrscheinlich alle Datenoperationen (Sortieren, Mittelwertbildung usw.) zusätzlich zum Datenabruf einbauen. Auf diese Weise brauchen Sie nur Ihren Code auszuführen, und Sie erhalten den tatsächlichen Bericht, den Sie wünschen.

Das hängt davon ab, wie oft Sie diese Aufgabe durchführen wollen.

2voto

Christian Payne Punkte 6992

Excel kann eine http-Seite öffnen.

Beispiel:

  1. Klicken Sie auf Datei, Öffnen

  2. Fügen Sie unter Dateiname die URL ein, z. B: Wie kann ich eine HTML-Tabelle in eine CSV-Datei umwandeln?

  3. Ok klicken

Excel tut sein Bestes, um die HTML-Datei in eine Tabelle umzuwandeln.

Es ist nicht die eleganteste Lösung, aber es funktioniert!

2voto

Aviad Punkte 323

Einfache Python-Implementierung unter Verwendung von BeautifulSoup, die auch rowspan und colspan berücksichtigt:

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)

1voto

Hier ist ein getestet Beispiel, das grequest und soup kombiniert, um große Mengen von Seiten von einer strukturierten Website herunterzuladen:

#!/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)

0voto

Will Rickards Punkte 2748

Haben Sie versucht, die Datei mit Excel zu öffnen? Wenn Sie eine Kalkulationstabelle in Excel als HTML speichern, sehen Sie das Format, das Excel verwendet. In einer Webanwendung, die ich geschrieben habe, gebe ich dieses HTML-Format aus, damit der Benutzer nach Excel exportieren kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X