2009-05-28 5 views
2

Ich versuche, Zeilen von über 1200 HTM-Dateien, die auf meiner Festplatte sind, zu kratzen. Auf meinem Computer sind sie hier 'Datei: ///home/phi/Data/NHL/pl07-08/PL020001.HTM'. Diese HTM-Dateien sind sequenziell von * 20001.htm bis * 21230.htm. Mein Plan ist es schließlich, meine Daten in MySQL oder SQLite über eine Tabellenkalkulations-App zu werfen oder einfach direkt hinein, wenn ich eine saubere .csv-Datei aus diesem Prozess herausholen kann.Mehrere HTML-Dateien in CSV-Datei scannen

Dies ist mein erster Versuch Code (Python), Scraping, und ich habe gerade Ubuntu 9.04 auf meinem crappy Pentium IV installiert. Unnötig zu sagen, dass ich neu bin und einige Straßensperren habe.

Wie bekomme ich mechanisieren, um alle Dateien im Verzeichnis in Reihenfolge durchlaufen. Kann das sogar mechanisieren? Kann mechanisieren/Python/BeautifulSoup eine 'file: ///' Style-URL lesen oder gibt es eine andere Möglichkeit, auf /home/phi/Data/NHL/pl07-08/PL020001.HTM zu zeigen? Ist es schlau, das in 100 oder 250 Dateischritten zu machen oder einfach alle 1230 zu senden?

Ich brauche nur Zeilen, die mit diesem "<tr class="evenColor">" beginnen und mit diesem "</tr>" enden. Idealerweise möchte ich nur die Zeilen, die "SHOT" | "MISS" | "GOAL" enthalten, aber ich möchte die ganze Zeile (jede Spalte). Beachten Sie, dass "GOAL" fett gedruckt ist, muss ich das also angeben? Es gibt 3 Tabellen pro HTM-Datei.

Auch möchte ich den Namen der übergeordneten Datei (pl020001.htm) in die Zeilen, die ich kratzen, so dass ich sie in ihrer eigenen Spalte in der endgültigen Datenbank ID enthalten kann. Ich weiß nicht einmal, wo ich anfangen soll. Dies ist, was ich bisher habe:

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

Sollte ich IDLE oder etwas ähnliches verwenden? nur Terminal in Ubuntu 9.04?

Antwort

1

Sie brauchen keine Mechanisierung. Da ich den HTML-Inhalt nicht genau kenne, würde ich zuerst versuchen, zu sehen, was passt. Wie folgt aus:

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 

Dann wählen Sie das Zeug Sie wollen, und schreiben Sie es mit Komma nach stdout (und es umleiten> in eine Datei). Oder schreibe den csv über Python.

+0

So, hier ist die HTML-Inhalt der Zeile: 56 1 PP GOAL Auch hier würde ich die ganze Reihe mag und die Dateinamen einschließlich (pl020001.htm) als Spalte in der Zeile geschabt, wenn möglich. – northnodewolf

+0

'schreibe die csv via python' Ich weiß nicht, wie das geht, aber würde gerne wissen. Benötige ich "Import CSV"? – northnodewolf

+0

@northnodewolf: Veröffentlichen Sie eine neue Frage mit den neuen Fakten über die HTML-Struktur und die CSV, die Sie aus der HTML-Tabelle erstellen möchten. –

0

MYYNs Antwort sieht für mich wie ein guter Anfang aus. Eine Sache, die ich darauf hinweisen würde, dass ich Glück hatte mit ist:

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

ich gefunden habe, sowohl die os und glob Importe um wirklich nützlich für die in einem Verzeichnis durch Dateien ausgeführt wird.

Wenn Sie auf diese Weise eine for-Schleife verwenden, haben Sie die file_name, die Sie für die Verwendung in der Ausgabedatei ändern können, damit die Ausgabedateinamen den Eingabedateinamen entsprechen.

+0

sieht besser aus, danke. – miku