2009-05-28 14 views
2

J'essaye de rayer des lignes de plus de 1200 fichiers .htm qui se trouvent sur mon disque dur. Sur mon ordinateur, ils sont ici 'file: ///home/phi/Data/NHL/pl07-08/PL020001.HTM'. Ces fichiers .htm sont séquentiels de * 20001.htm jusqu'à * 21230.htm. Mon plan est de finir par jeter mes données dans MySQL ou SQLite via une application de tableur ou tout simplement si je peux obtenir un fichier .csv propre de ce processus.Grattage de plusieurs fichiers html au format CSV

Ceci est ma première tentative de code (Python), grattage, et je viens d'installer Ubuntu 9.04 sur mon Pentium IV minuscule. Inutile de dire que je suis newb et que j'ai des barrages routiers.

Comment puis-je obtenir mécanize de parcourir tous les fichiers dans le répertoire dans l'ordre. Est-ce que mécaniser peut même faire ça? Peut-on mécaniser/Python/BeautifulSoup lire une url de style 'file: ///' ou existe-t-il un autre moyen de pointer vers /home/phi/Data/NHL/pl07-08/PL020001.HTM? Est-il intelligent de le faire en incréments de 100 ou 250 fichiers ou simplement envoyer tous les 1230?

J'ai juste besoin de lignes commençant par "<tr class="evenColor">" et finissant par "</tr>". Idéalement, je ne veux que les lignes qui contiennent "SHOT" | "MISS" | "GOAL" en eux, mais je veux la ligne entière (chaque colonne). Notez que "GOAL" est en gras alors dois-je le spécifier? Il y a 3 tables par fichier htm.

Je voudrais également que le nom du fichier parent (pl020001.htm) soit inclus dans les lignes que je racle afin que je puisse les identifier dans leur propre colonne dans la base de données finale. Je ne sais même pas par où commencer pour ça. C'est ce que j'ai pour le moment:

#/usr/bin/python 
from BeautifulSoup import BeautifulSoup 
import re 
from mechanize import Browser 

mech = Browser() 
url = "file:///home/phi/Data/NHL/pl07-08/PL020001.HTM" 
##but how do I do multiple urls/files? PL02*.HTM? 
page = mech.open(url) 

html = page.read() 
soup = BeautifulSoup(html) 
##this confuses me and seems redundant 
pl = open("input_file.html","r") 
chances = open("chancesforsql.csv,"w") 

table = soup.find("table", border=0) 
for row in table.findAll 'tr class="evenColor"' 
#should I do this instead of before? 
outfile = open("shooting.csv", "w") 

##how do I end it? 

Dois-je utiliser IDLE ou quelque chose comme ça? juste Terminal dans Ubuntu 9.04?

Répondre

1

Vous n'aurez pas besoin de mécanisation. Comme je ne connais pas exactement le contenu HTML, j'essaierais de voir ce qui correspond, d'abord. Comme ceci:

import glob 
from BeautifulSoup import BeautifulSoup 

for filename in glob.glob('/home/phi/Data/*.htm'): 
    soup = BeautifulSoup(open(filename, "r").read()) # assuming some HTML 
    for a_tr in soup.findAll("tr", attrs={ "class" : "evenColor" }): 
     print a_tr 

ramasser ensuite les trucs que vous voulez et l'écrire à stdout par des virgules (et rediriger> dans un fichier). Ou écrivez le csv via python.

+0

Voici donc le contenu HTML de la ligne: 56 1 PP BUT Encore une fois, je voudrais toute la ligne et y compris le nom du fichier (pl020001.htm) en tant que colonne de la ligne raclée si possible. – northnodewolf

+0

'écrire le csv via python' Je ne sais pas comment faire cela, mais je voudrais savoir. Ai-je besoin d''importer csv'? – northnodewolf

+0

@northnodewolf: Postez une nouvelle question avec les nouveaux faits sur la structure HTML et le fichier CSV que vous souhaitez créer à partir du tableau HTML. –

0

La réponse de MYYN me semble être un bon début. Une chose que je voudrais souligner que j'ai eu la chance avec est:

import glob 
    for file_name in glob.glob('/home/phi/Data/*.htm'): 
     #read the file and then parse with BeautifulSoup 

Je l'ai trouvé à la fois les os et glob importations pour être vraiment utile pour l'exécution par les fichiers dans un répertoire. En outre, une fois que vous utilisez une boucle for de cette manière, vous avez le file_name que vous pouvez modifier pour l'utiliser dans le fichier de sortie, de sorte que les noms de fichiers de sortie correspondent aux noms de fichiers d'entrée.

+0

semble mieux, merci. – miku

Questions connexes