2016-03-21 2 views
0

Also wollte ich Statuten von dieser Website kratzen: Python Web Scraping mit BeautifulSoup, wie kommt es, meine Ausgabe-Datei den Inhalt dreimal mit unterschiedlichem Format ausdrucken?

I https://www.dropbox.com/s/2l41o1eubutwanh/outflieFS.txt?dl=0: http://www.leg.state.fl.us/Statutes/index.cfm?App_mode=Display_Statute&URL=0000-0099/0001/0001.html

konnte ich die Ausgabe in eine txt Datei schreiben, die Ausgabe drei verschiedene Formate jedoch ausgedruckt, wie hier gezeigt Ich bin nicht gut in der Formatierung der Ausgabe. Könnte es etwas falsch mit meiner write Aussage sein, oder wo mache ich mich falsch?

mein Code:

from bs4 import BeautifulSoup 
import urllib2 

f = open('C:\Python27\projects\outflieFS.txt','w') 

def First_part(url): 
    thepage = urllib2.urlopen(url) 
    soupdata = BeautifulSoup(thepage,'html.parser') 
    return soupdata 


soup = First_part("http://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0000-0099/0002/0002.html") 

tableContents = soup.find('div', {'id': 'statutes' }) 

for data in tableContents.findAll('div'): 
    data = data.text.encode("utf-8","ignore") 
    data = str(data)+ "\n\n" 
    f.write(data) 

f.close() 
+0

Bitte poste deine Ausgabe nicht als Bild :) – Signal

+0

Mein Fehler, ich habe es in einen Dropbox-Link geändert – CHballer

+0

Wie soll das Ausgabeformat aussehen? – bmcculley

Antwort

0

Ich werde versuchen zu erklären, was passiert ist, so können Sie das funktioniert: wenn Sie den find_all nennen, planify Sie die hierarchische Struktur des div im Inhalt. Also, wenn Sie über 3 Ebene div haben, haben Sie drei Elemente als Ergebnis Ihres find_all und Ihr Ergebnis (ich habe keinen Zugriff auf Ihre Dropbox, also ich habe nicht sah es) soll wie folgt aussehen:

div div div content 
div div same content 
div same content again 

Also, die Lösung besteht darin, die Klasse oder ID der innersten Div und identifizieren sie auf der Find_all, um nur eine Ebene zu erhalten, die Sie benötigen.

0

Schreiben Sie recursive = False als Argument in find_all. Bei der Methode find_all wird standardmäßig auf alle Nachkommen des Tags (z. B. "div") geprüft, was zu Wiederholungen in den Ergebnissen führt. Die Linie wird wie folgt aussehen:

for data in tableContents.findAll('div', recursive=False):

find_all wird nun die direkten Nachkommen untersuchen nur, das heißt die Tags direkt unter ‚div‘. Die Tags werden nicht innerhalb dieser Tags verschachtelt.

Die Folge davon ist, dass find_all nur Ergebnisse zurückgibt, die die direkten Kinder des Tags sind, das in den Klammern angegeben wurde.