Seite 1 von 1

xml,soup beautiful parser,jede titel allein behandeln

Verfasst: Mittwoch 21. Mai 2008, 10:17
von dareal
hallo zusammen,

ich versuche die titel innerhalb ein xml datei zu extrahieren und in einem DB zu speichern.

ich benutze soup Beautiful als Parser.

mein Problem ist : ich kann nur den ersten titel im ersten item zu parsen ,weitere item könnte ich nicht dadrauf zu greifen,da ich Python anfänger bin ich habe kein konkrete lösung dafür,das heisst mein program soll in die nächste item springen ,den titel parsen und in die nächste position speichern.

bis jetzt habe ich das geschfft:

Code: Alles auswählen

source="seite.xml"
page = urllib.urlopen(source)
soup = BeautifulSoup(page)
item=soup.rss.item

for d in item.findAll('title'):
  print d.string              #hier wird den ersten titel innerhalb den ersten        
                                  #item gelesen
  
wie kann ich den ersten d.string (also hier mein titel) in eine dict[0] speichern? und wie gehts weiter mit dem zweiten item??

ich hab wirklich keine ahnung wie das weiter geht
HILFE
danke im Voraus

Verfasst: Mittwoch 21. Mai 2008, 10:45
von dareal
ok ich hab jetzt geschaft den ersten titel in einem array zu speichern,aber bleibt immer das problem mir dem nächsten <item> Sprung und den titel wieder zu holen

Code: Alles auswählen


s={}
i=0
for d in item.findAll('titel'):
  s[i]= d.string
  i = i + 1
  print s.values()        #ergebniss ->[heute im Nachricht]

Verfasst: Mittwoch 21. Mai 2008, 11:04
von Leonidas
Hallo dareal, willkommen im Forum,

Magst du ins auf paste.pocoo.org so eine XML-Datei hinterlegen? Es ist in der Regel besser as passene Tool für die Aufgabe zu nutzen, im Falle von XML-Parsen wäre das wohl ElementTree.

Verfasst: Mittwoch 21. Mai 2008, 11:11
von BlackJack
@dareal: Das was Du da "array" nennst ist ein Dictionary und vielleicht nicht die geeignetste Datenstruktur, wenn Du fortlaufende Schlüssel von 0 aufwärts verwendest. Lass das `i` weg und benutze eine Liste wo Du die Daten anhängst.

Wieviele Titel gibt es denn pro Item? Wenn das nur einer ist, dann ist die ``for``-Schleife mit dem `findAll()` unsinnig weil die dann ja grundsätzlich nur einmal durchlaufen wird.

Mach lieber eine Schleife über die Items und hole dort dann den Titel per Direktzugriff heraus. Ungetestet:

Code: Alles auswählen

source = 'seite.xml'
page = urllib.urlopen(source)
soup = BeautifulSoup(page)

titles = list()
for item in soup.rss.findAll('item'):
    titles.append(item.title.string)
Zu Leonidas Vorschlag würde ich noch `lxml.etree` ergänzen, da kann man XPath-Ausdrücke verwenden.

Verfasst: Mittwoch 21. Mai 2008, 11:13
von dareal
ok hier hab ich das link :
http://paste.pocoo.org/show/52189/

und noch etwas z.b: köln siht in meine array ganz komisch ->[u'K\xf6ln']

wie kann ich das vermeiden,ich will nur [köln] ??ist das wegen .values() ??

danke

Verfasst: Mittwoch 21. Mai 2008, 11:45
von dareal
@BlackJack : danke deine Lösung hat mir geholfen,ich habe bis jetzt alle title raus geholt,und im Dictionnary gespeichert :)
sorry für die Array :ich komme aus der c++ welt :)

aber ich hab immer das problem mit umlaut z.B Köln ->[u'K\xf6ln']

Verfasst: Mittwoch 21. Mai 2008, 11:56
von BlackJack
Wegen Köln -- Das hier lesen und verstehen: [wiki]Von Umlauten, Unicode und Encodings[/wiki]

Verfasst: Donnerstag 22. Mai 2008, 10:31
von dareal
okay hat super gelaufen
danke

Verfasst: Freitag 23. Mai 2008, 14:27
von mpathy
Ansonsten nimm BeautifulStoneSoup nicht BeautifulSoup, das ist besser für deine Zwecke.