Hallo,
ich habe einen String der so aussieht:
<div><div id="ti">Regierung macht Druck</div> Israel will die Zwangsrä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
parse line
-
- User
- Beiträge: 128
- Registriert: Freitag 22. Oktober 2004, 09:22
- Wohnort: Salzgitter
- Kontaktdaten:
Moinsen...
Einen kleinen Einstieg zu RegEx findest du hier.
Code: Alles auswählen
print re.findall(""".*<div id="ti">(.+?)</div>.*""", s)[0]
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.
Hi,
hast du vertippt, <div><div id="ti">Regierung ..
egal! du kast mit SAX Parser versuchen. Dort sollte du startElement, EndElement und characters überschreiben:
hoffe es hilft dir.
HL
Edit (Leonidas): Code in Python-Tags gesetzt.
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))
HL
Edit (Leonidas): Code in Python-Tags gesetzt.
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.
Zwar dürfte sax diese Tatsache ignorieren, aber logischer scheint es trotzdem
den HTMLParser zu nehmen, der ansonsten genau wie sax funktioniert.
-
- 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
Hallo,
es besteht noch das Problem mit den z.B. $ 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?
es besteht noch das Problem mit den z.B. $ 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?
-
- 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))
'$'
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
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
das mit dem Re-complie klappt noch immer nicht.
dies kann man im interaktiven Modus testen:
[/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
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)
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.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das sieht auch irgendwie komisch aus... Hier mal eine andere variante:patrickk hat geschrieben:r = re.compile(r'(?<=<item>).*(?=</item>)')
Code: Alles auswählen
r = re.compile(r'<item>(.*?)</item>')
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
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
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Dann stimmt was mit deinen Daten nicht:
Ausgabe:
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)
['Ich bin gefunden!']
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...
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...
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
In dem Fall solltest du das machen:patrickk hat geschrieben:es kommt auch /n vor. Ist das ein Problem?
Code: Alles auswählen
r = re.compile(r'<item>(.*?)</item>(?s)')
S
DOTALL
Make the "." special character match any character at all, including a newline; without this flag, "." will match anything except a newline.