Question

Je suis en train de gratter les lignes hors de plus de 1200 fichiers .htm qui sont sur mon disque dur. Sur mon ordinateur, ils sont ici « fichier: ///home/phi/Data/NHL/pl07-08/PL020001.HTM ». Ces fichiers .htm sont séquentiels de * 20001.htm jusqu'à * 21230.htm. Mon plan est de lancer éventuellement mes données dans MySQL ou SQLite via une application de tableur ou tout droit si je peux obtenir un fichier .csv propre de ce processus.

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

Comment puis-je mécaniser passer par tous les fichiers dans le répertoire en ordre. Peut mécaniser faire encore cela? Peut mécaniser / Python / BeautifulSoup lire un « file: /// » url de style ou est-il une autre façon de pointer vers /home/phi/Data/NHL/pl07-08/PL020001.HTM? Est-il intelligent de faire cela dans 100 ou 250 incréments de fichiers ou tout simplement envoyer tous 1230?

J'ai juste besoin de lignes qui commencent par ce « <tr class="evenColor"> » et se terminent par cette « </tr> ». Idéalement, je veux que les lignes qui contiennent « SHOT » | « MISS » | « BUT » en eux mais je veux toute la ligne (chaque colonne). Notez que « BUT » est en gras alors dois-je le préciser? Il y a 3 tables par fichier htm.

Je voudrais aussi le nom du fichier parent (pl020001.htm) à inclure dans les lignes que je gratter si je peux les id dans leur propre colonne dans la base de données finale . Je ne sais même pas par où commencer pour cela. Voilà ce que j'ai jusqu'à présent:

#/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?

Était-ce utile?

La solution

Vous ne aurez pas besoin mécaniser. Comme je ne sais pas exactement le contenu HTML, je vais essayer 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

choisissez ensuite les choses que vous voulez et l'écrire à stdout par des virgules (et rediriger> vers un fichier). Ou écrire le csv via python.

Autres conseils

La réponse de MYYN ressemble à un bon début pour moi. 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 importations et os glob pour être vraiment utile pour l'exécution par le biais des fichiers dans un répertoire.

En outre, une fois que vous utilisez une boucle de cette façon, vous avez la file_name que vous pouvez modifier pour une utilisation dans le fichier de sortie, de sorte que les fichiers de sortie correspondront aux noms de fichiers d'entrée.

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