Question

Le problème

J'utilise un outil au travail qui me permet de faire des requêtes et de récupérer des tableaux d'informations HTML. Je n'ai aucun type d'accès back-end à celui-ci.

Beaucoup de ces informations seraient beaucoup plus utiles si je pouvais les mettre dans un tableur pour les trier, les calculer en moyenne, etc. Comment puis-je supprimer ces données dans un fichier CSV? p>

Ma première idée

Étant donné que je connais jQuery, j’ai pensé que je pourrais l’utiliser pour supprimer le formatage du tableau à l’écran, insérer des virgules et des sauts de ligne, et simplement copier tout le désordre dans le bloc-notes et l’enregistrer au format CSV. De meilleures idées?

La solution

Oui, c'était vraiment aussi simple que copier et coller. Je ne me sens pas bête.

Plus précisément, lorsque je collais dans la feuille de calcul, je devais sélectionner "Coller spécial". et choisissez le format " texte. " Sinon, il a essayé de tout coller dans une seule cellule, même si j’ai mis en évidence l’ensemble de la feuille de calcul.

Était-ce utile?

La solution

  • Sélectionnez le tableau HTML dans l'interface utilisateur de vos outils et copiez-le dans le Presse-papiers (si cela est possible
  • Collez-le dans Excel.
  • Enregistrer en tant que fichier CSV

Cependant, il s’agit d’une solution manuelle et non automatisée.

Autres conseils

en utilisant python:

Par exemple, imaginez que vous souhaitiez effacer des citations forex au format CSV depuis un site tel que: 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 les valeurs 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)

Ceci est ma version python utilisant la dernière version (actuellement) de BeautifulSoup, qui peut être obtenue à l'aide, par exemple,

.
$ sudo easy_install beautifulsoup4

Le script lit le code HTML à partir de l'entrée standard et génère le texte trouvé dans tous les tableaux au 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([])

Encore plus facile (parce que cela vous le réserve pour la prochaine fois) ...

Dans Excel

Données / Importer des données externes / Nouvelle requête Web

vous mènera à une invite d'URL. Entrez votre URL, et cela délimitera les tableaux disponibles sur la page à importer. Voilà.

Deux manières me viennent à l’esprit (surtout pour ceux d’entre nous qui n’ont pas d’Excel):

  • Google Spreadsheets a une excellente importHTML :
    • = importHTML ("http: //exemple.com/page/with/table" ;," table ", index
    • L'index commence à 1
    • Je recommande une copie et une valeur de collage peu de temps après l'importation
    • Fichier - > Télécharger en tant que - > CSV
  • La superbe bibliothèque Pandas de Python est pratique read_html et to_csv
    • Voici un script Python3 de base qui invite à indiquer l'URL, le tableau correspondant à cette URL et un nom de fichier pour le CSV.

Rapide et sale:

Copiez le navigateur dans Excel, enregistrez-le au format CSV.

Meilleure solution (pour une utilisation à long terme):

Écrivez un peu de code dans la langue de votre choix pour extraire le contenu html et extraire les bits de votre choix. Vous pourriez probablement ajouter toutes les opérations de données (tri, moyenne, etc.) en plus de la récupération des données. De cette façon, il vous suffit de lancer votre code et d’obtenir le rapport que vous souhaitez.

Tout dépend de la fréquence à laquelle vous effectuerez cette tâche particulière.

Excel peut ouvrir une page http.

Par exemple:

  1. Cliquez sur Fichier, Ouvrir

  2. Sous le nom du fichier, collez l'URL, à savoir: Comment puis-je gratter un tableau HTML au format CSV?

  3. Cliquez sur ok

Excel fait de son mieux pour convertir le code HTML en tableau.

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

Implémentation de base de Python utilisant BeautifulSoup, en tenant également compte de rowspan et de 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)

Voici un exemple testé qui combine la soupe aux légumes et au 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)

Avez-vous essayé de l’ouvrir avec Excel? Si vous enregistrez une feuille de calcul dans Excel au format HTML, vous verrez le format utilisé par Excel. À partir d’une application Web que j’ai écrite, j’ai recraché ce format HTML pour permettre à l’utilisateur d’exporter vers Excel.

Si vous nettoyez l’écran et que la table que vous essayez de convertir a un identifiant donné, vous pouvez toujours effectuer une analyse rationnelle du code HTML avec des scripts pour générer un CSV.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top