Seite 1 von 1

parse line

Verfasst: Donnerstag 18. August 2005, 14:04
von patrickk
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

Verfasst: Donnerstag 18. August 2005, 14:09
von Redprince
Moinsen...

Code: Alles auswählen

print re.findall(""".*<div id="ti">(.+?)</div>.*""", s)[0]
Einen kleinen Einstieg zu RegEx findest du hier.

Verfasst: Donnerstag 18. August 2005, 14:51
von henning
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.

Verfasst: Donnerstag 18. August 2005, 19:58
von 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.

Verfasst: Donnerstag 18. August 2005, 20:03
von 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.

Verfasst: Donnerstag 18. August 2005, 20:07
von Leonidas
Ich verweise auch noch auf meinen alten Regulären Ausdruck. Der ist übrigens auch in der FAQ, die du lesen solltest, patrickk.

parse

Verfasst: Montag 29. August 2005, 15:28
von patrickk
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?

Verfasst: Montag 29. August 2005, 15:57
von SeB
meinst du sowas:

Code: Alles auswählen

>>> a = '$'
>>> chr(int(a[3:5],16))
'$'

hallo

Verfasst: Mittwoch 31. August 2005, 13:25
von patrickk
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

hi

Verfasst: Dienstag 6. September 2005, 10:29
von patrickk
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

Re: hi

Verfasst: Dienstag 6. September 2005, 10:53
von jens
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>')

Verfasst: Dienstag 6. September 2005, 11:19
von patrickk
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

Verfasst: Dienstag 6. September 2005, 11:22
von jens
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!']

Verfasst: Dienstag 6. September 2005, 11:27
von patrickk
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...

Verfasst: Dienstag 6. September 2005, 11:58
von jens
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.

Verfasst: Dienstag 6. September 2005, 12:12
von Leonidas
Kannst auch beim re.compile als Option re.DOTALL angeben oder vielleicht noch re.MULTILINE.

danke

Verfasst: Dienstag 6. September 2005, 12:16
von patrickk
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