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.
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.
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)
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([])
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é.
deux voies viennent à L'esprit (surtout pour ceux d'entre nous qui N'ont pas Excel):
- tableurs Google a une excellente
importHTML
fonction :-
=importHTML("http://example.com/page/with/table", "table", index
- Index commence à 1
- je recommande un
copy
etpaste values
peu après l'importation - Fichier - > Télécharger comme - > CSV
-
- Python superbe Pandas bibliothèque a à portée de main
read_html
etto_csv
fonctions- Voici un script python3 de base qui invite L'URL, la table à cette URL, et un nom de fichier pour le CSV.
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.
Excel peut ouvrir une page http.
par exemple:
-
, Cliquez Sur Fichier, Ouvrir
-
sous nom de fichier, coller l'URL ie: Comment puis-je gratter une table HTML à CSV?
-
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!
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 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)
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.
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.