parse line

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Hallo,

ich habe einen String der so aussieht:


<div><div id="ti">Regierung macht Druck</div> Israel will die Zwangsr&#xe4;umung aller Siedlungen im Gaza-Streifen bis Montag... <a id="li" href="http://vlive.vizzavi.de/vsky/cc/Tomorro ... .</a><span id="me" style="--vf-lc-ch:Focus; --vf-lc-dt:20050818143125+02; --vf-lc-ic:news"/></div>

Jetzt will ich nur "Regierung macht Druck " extrahieren. wie geht das am einfachsten?

Habe Leonidas anleitung zum XML Parsen versucht, aber hinten steht auch noch ein </div>

Leider verstehe ich nicht ganz wie es funktioniert.

Oder kennt jemand eine Seite, die zum parsen eine gute anleitung hat?


Patrick
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Moinsen...

Code: Alles auswählen

print re.findall(""".*<div id="ti">(.+?)</div>.*""", s)[0]
Einen kleinen Einstieg zu RegEx findest du hier.
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Wenn dir die regulären Ausdrücke manchmal Probleme machen sollten, weil sie zu "eng" sind, wäre eventuell auch BeautifulSoup ne Lösung (einfach mal nach googlen), wenns die RegEx tut, solltest dus aber ruhig dabei belassen.
Gast

Hi,

hast du vertippt, <div><div id="ti">Regierung ..

egal! du kast mit SAX Parser versuchen. Dort sollte du startElement, EndElement und characters überschreiben:

Code: Alles auswählen

from xml.sax import make_parser
from xml.sax.handler import ContentHandler

class MyHandler(ContentHandler):
	
       finddiv = 0
	def startElement(self, name, attrs):
		if name == "div":
                                      att = attrs.get("id", "")
                                      if (att):
			self.finddiv =1
	def characters(self, characters):
		if self.finddiv:
			self.text += characters
			
	def endElement(self, name):
		if (name == "div" and (self.finddiv)
			print self.text			                                self.finddiv =0


	mh = MyHandler()
	parser = make_parser()	
	parser.setContentHandler(mh)
                  parser.parse(StringIO(deinStr))
hoffe es hilft dir.

HL

Edit (Leonidas): Code in Python-Tags gesetzt.
Gast

Sax itself würde ich nicht empfehlen, da es hier anscheinend um HTML geht, welches per se NICHT XML-wohlgeformt ist.
Zwar dürfte sax diese Tatsache ignorieren, aber logischer scheint es trotzdem
den HTMLParser zu nehmen, der ansonsten genau wie sax funktioniert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich verweise auch noch auf meinen alten Regulären Ausdruck. Der ist übrigens auch in der FAQ, die du lesen solltest, patrickk.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Hallo,

es besteht noch das Problem mit den z.B. &#x24; Werten. eigentlich sollte es u'\x24' sein. Es kommt aber leider so an und laesst sich nicht aendern. Ich kann nach &# suchen. Aber wie kann ich x24 in \x24 wandeln?
Ich kann ja nicht val =u'\' anlegen und dann da den rest anhaengen...val = val +u'x24'

Hat da jmd. eine idee?
SeB
User
Beiträge: 25
Registriert: Mittwoch 24. August 2005, 14:29
Wohnort: Buchenau/Hessen
Kontaktdaten:

meinst du sowas:

Code: Alles auswählen

>>> a = '$'
>>> chr(int(a[3:5],16))
'$'
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

nochmal zu html parse. Ist ja nicht well formed. Wenn ich erst einmal alle hrefs haben will koebnnte ich ja folgendes machen:

import re
import urllib

urladd = urllib.urlopen ('http://www.egal.de')
htmltext = urladd.read ()

r = re.compile(r'(?<=href=").*(?="><img src=)')
#noch schoener faende ich:
#r = re.compile(r'(?<=href="http://www.fotocommunity.de/pc/pc/extra/buddies/).*(?="><img src=)')

s=r.recompile(htmltext)

Ich bekomme jetzt aber kein array in dem die ganzen passagen aufgelistet sind, die zwischen den Suchwoertern stehen, sondern ganz grosse Stuecke. Ist hier etwas falsch?
Bei dem letzten kommt aber gar nichts raus. Eigentlich sollten da nur die links sein, die mich interessieren...


Patrick
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

das mit dem Re-complie klappt noch immer nicht.

dies kann man im interaktiven Modus testen:


Code: Alles auswählen

# Funktioniert jetzt parst xml newsserver
import re
import urllib
e=urllib.urlopen('http://rss.cnn.com/rss/cnn_topstories.rss')
text = e.read()

r = re.compile(r'<item>(.*?)</item>(?s)')
#ich wurde gerne in der XML(well formed) Datei alle Inhalte haben, die in den item tags stehen.
s=re.findall(r,text)
print (s)

[/b]
s enthaelt nie ein element? Warum nicht. Was ist hier falsch? Ich habe das Problem mit feedparser geloest, wurde aber trotzdem gerne wissen, warum es nicht me re klappt. So koennte man ja selbst dann in dem Ergebniss wieder nach title tag... suchen...


Patrick
Zuletzt geändert von patrickk am Dienstag 6. September 2005, 12:14, insgesamt 6-mal geändert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

patrickk hat geschrieben:r = re.compile(r'(?<=<item>).*(?=</item>)')
Das sieht auch irgendwie komisch aus... Hier mal eine andere variante:

Code: Alles auswählen

r = re.compile(r'<item>(.*?)</item>')

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

hi, danke.. das habe ich auch probiert. Es kommt immer [] raus...
habe auch schon text=str(text) versucht. Geht das vielleicht nicht bei langen Eintraegen?
Dann habe ich das mit dem re.compile scheinbar aber schon ein bischen verstanden... Weis nur nicht warum das hier nie klappt?

Patrick
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dann stimmt was mit deinen Daten nicht:

Code: Alles auswählen

import re

test = """
BlaBla<item>Ich bin gefunden!</item>BlubBlub
"""
r = re.compile(r'<item>(.*?)</item>')
print re.findall(r,test)
Ausgabe:
['Ich bin gefunden!']

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

ich habe den server mitangegeben. Man kann es kurz anschauen. Dort ist item vorhanden und auch </item>. Dazwischen gibt es aber noch andere tags wie <title>, es kommt auch /n vor. Ist das ein Problem?

So sieht ein item element aus:

<item>\n<title>Violence rages in Iraq hotspots</title>\n<link>http://www.cnn.com/rssclick/2005/WORLD/ ... n>Violence in several Iraqi hotspots Monday claimed more coalition and insurgent deaths in pitched battles and ambushes up and down the war-torn country.</description>\n<pubDate>Mon, 05 Sep 2005 21:32:07 EDT</pubDate>\n</item>

Habe die Loesung gefunden!!!

man muss text = repr(text) machen, damit es klappt. Weiss jmd. warum es mit text = str(text) nicht geht? Werden da vielleicht durch XML oder so die Zeichen < anders dargestellt, sodass er den tag nicht findet? Im interaktiven modus sieht allerdings alles gut aus...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

patrickk hat geschrieben:es kommt auch /n vor. Ist das ein Problem?
In dem Fall solltest du das machen:

Code: Alles auswählen

r = re.compile(r'<item>(.*?)</item>(?s)')
Warum? Steht in der Doku:
S
DOTALL
Make the "." special character match any character at all, including a newline; without this flag, "." will match anything except a newline.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kannst auch beim re.compile als Option re.DOTALL angeben oder vielleicht noch re.MULTILINE.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Jetzt habe ich gefunden was nicht ging. Super, jetzt weiss ich wie man die flags dafuer noch setzt. Ich dachte mit findall waere alles inklusive...

Aber jetzt geht es ja.

Danke,


Patrick
Antworten