Comment puis-je racler une table HTML à CSV?

Le Problème

j'utilise un outil au travail qui me permet de faire des requêtes et de récupérer des tables D'information HTML. Je n'ai pas de type de retour la fin de l'accès.

beaucoup de ces informations seraient beaucoup plus utiles si je pouvais les mettre dans une feuille de calcul pour le tri, la moyenne, etc. Comment puis-je screen-Scraper ces données dans un fichier CSV?

Ma Première Idée

comme je connais jQuery, je pensais que je pourrait l'utiliser pour rayer le formatage de la table à l'écran, insérer des virgules et des sauts de ligne, et il suffit de copier l'ensemble du gâchis dans Bloc-notes et enregistrer comme un CSV. une meilleure idée?

La Solution

Oui, les amis, c'était aussi facile que de copier et coller. Ne pas me sentir ridicule.

plus précisément, lorsque j'ai collé dans la feuille de calcul, j'ai dû sélectionner" coller spécial "et choisir le format" texte."Sinon, il a essayé de collez tout dans une seule cellule, même si j'ai surligné toute la feuille de calcul.

38
demandé sur Nathan Long 2008-11-03 19:00:26

11 réponses

  • sélectionnez la table HTML dans L'interface utilisateur de vos outils et copiez-la dans le presse-papiers (si c'est possible
  • coller dans Excel.
  • Enregistrer sous fichier CSV

cependant, il s'agit d'une solution manuelle et non automatisée.

32
répondu mkoeller 2008-11-03 17:06:31

utilisant python:

par exemple imaginez que vous voulez gratter des citations de forex sous forme de csv à partir d'un site comme: fxquotes

alors...

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,'</pre>]','')
file_location = '/Users/location_edit_this'
file_name = file_location + 'usd_aus.csv'
file = open(file_name,"w")
file.write(data)
file.close()

edit: pour obtenir des valeurs à partir d'une table: exemple tiré de: palewire

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)
12
répondu Thorvaldur 2008-11-11 18:24:07

C'est ma version python utilisant la dernière version de BeautifulSoup qui peut être obtenue en utilisant, par exemple,

$ sudo easy_install beautifulsoup4

le script lit HTML à partir de l'entrée standard, et sort le texte trouvé dans tous les tableaux dans le format CSV approprié.

#!/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([])
10
répondu Juan A. Navarro 2013-05-22 17:11:10

encore plus facile (parce qu'il sauve pour vous pour la prochaine fois) ...

In Excel

Données/Données Externes/Nouvelle Requête Sur Le Web

vous mènera à une invite d'url. Entrez votre url, et il délimitera les tables disponibles sur la page à importer. Le tour est joué.

5
répondu dkretz 2008-11-11 03:04:50

deux voies viennent à L'esprit (surtout pour ceux d'entre nous qui N'ont pas Excel):

3
répondu n8henrie 2015-01-22 07:37:25

Rapide et sale":

copier hors du navigateur dans Excel, enregistrer comme CSV.

Meilleure solution (pour utilisation à long terme):

écrivez un peu de code dans la langue de votre choix qui va tirer le contenu html vers le bas, et racler les bits que vous voulez. Vous pourriez probablement ajouter toutes les opérations de données (tri, calcul de la moyenne, etc.) à la récupération de données. De cette façon, vous avez juste à lancer votre code et vous obtenez le rapport réel que vous voulez.

tout dépend de la fréquence à laquelle vous exécuterez cette tâche particulière.

2
répondu James Van Huis 2008-11-03 16:09:00

Excel peut ouvrir une page http.

par exemple:

  1. , Cliquez Sur Fichier, Ouvrir

  2. sous nom de fichier, coller l'URL ie: Comment puis-je gratter une table HTML à CSV?

  3. Cliquez sur ok

Excel fait de son mieux pour convertir le html en une table.

ce n'est pas la solution la plus élégante, mais ça marche!

2
répondu Christian Payne 2017-05-23 12:18:24
"151910920 de Base de Python de la mise en œuvre à l'aide de BeautifulSoup, compte tenu également de deux rowspan et 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
répondu Aviad 2015-03-26 10:34:00

voici un testé exemple qui combine grequest et soupe pour télécharger de grandes quantités de pages à partir d'un site web structuré:

#!/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)
1
répondu 2017-04-13 08:22:28

Avez-vous essayé de l'ouvrir avec excel? Si vous enregistrez une feuille de calcul dans excel en html, vous verrez le format utilisé par excel. À partir d'une application web que j'ai écrit je crache ce format html de sorte que l'utilisateur peut exporter à excel.

0
répondu Will Rickards 2008-11-03 16:09:18

si vous êtes screen scraping et que la table que vous essayez de convertir a un ID donné, vous pouvez toujours faire une analyse regex du html avec quelques scripts pour générer un CSV.

0
répondu andy 2008-11-03 17:09:22