parsen oder filtern

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

habs ja nun endlich geschafft, html seiten auszulesen. jetzt gibts nen neues problem. ich brauche ja bestimmte informationen, von der gesaugten html seite. was wäre da jetzt angebrachter, oder wie wäre es am besten, diese werte auszulesen? die html seite, liegt mir ja als string vor. wie wäre es jetzt am besten, die informationen, die ich brauche, aus der seite herauszufiltern / parsen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mit einem HTML-Scraper wie BeautifulSoup oder html5lib.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

habe mir das BeautifulSoup installiert. doch ich bin mir nicht sicher, ob es gerade das ist, was ich brauche. das modul ließt so weit ich das verstanden habe, nur zwischen zwei tags aus. ich muß aber nach einem wort ( so denke ich ) suchen. hier mal, nen kleiner schippschnapp aus der html seite, die ich durchsuchen will

Code: Alles auswählen

                        <!-- mails & shortmessages-->

                            <table width="100%" border="0" align="center" cellspacing="1">

                              <tr>

                                <td width="57%"><img src="http://image.onlineglueck.de/neu/main/mini_email.gif"> Neue <a href="/olg/mails/?folder=1">Mails:</a></td>

                                <td>0</td>

                              </tr>

                              <tr>

                                <td><img src="http://image.onlineglueck.de/neu/main/mini_shortmessage.gif"> Neue <a href="/olg/shortmessages/?folder=1">Shortmessages:</a></td>

                                <td align="left">0</td>

                              </tr>

                                                            <tr>

                                <td><img src="http://image.onlineglueck.de/neu/main/mini_gaestebuch.gif"> Neue <a href="/olg/profiledit/index.olg?action=guestbook">Gästebucheinträge:</a></td>

                                <td align="left">0</td>

                              </tr>

                                                                                                                      </table>

                            <!-- /mails & shortmessages-->
hier sieht man den eintrag "Shortmessages" uns ein paar spalten weiter, die anzahl ( hier 0 ) ich denke nicht, das mir das modul dabei weiter hilft, eher sollte ich das dingen doch mit diesen regulären ausdrücken durchsuchen, die mir aber echt kopfzerbrechen machen, weil die ja mal echt cryptisch sind.

@Leonidas
würdest du ds echt mit dem HTML-Scraper lösen? ist das möglich?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

The Hit-Man hat geschrieben:habe mir das BeautifulSoup installiert. doch ich bin mir nicht sicher, ob es gerade das ist, was ich brauche. das modul ließt so weit ich das verstanden habe, nur zwischen zwei tags aus.
Du schaust einfach wo die dich interessierende Nachricht drin steht, also in welchem Tag und greifst dadrauf zu. Das ist einfacher, als das ganze HTML mit regulären Ausdrücken durchzufiltern, wenn dich nur ein kleines Subset der Datei interessiert.
The Hit-Man hat geschrieben:hier sieht man den eintrag "Shortmessages" uns ein paar spalten weiter, die anzahl ( hier 0 ) ich denke nicht, das mir das modul dabei weiter hilft
Warum. Du suchst einfach nach dem TD welches nach einem TD steht, indem ein IMG mit src http://image.onlineglueck.de/neu/main/m ... essage.gif ist und liest das aus. Damit hast du dann deine gewünschte 0.
The Hit-Man hat geschrieben:@Leonidas
würdest du ds echt mit dem HTML-Scraper lösen? ist das möglich?
Natürlich. Ich würde mir doch nicht die Mühe machen, mir dafür reguläe Ausdrücke zu überlegen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

das werde ich mal versuchen. du scheinst es echt drauf zu haben mit python ;) ich habe gerade erst damit angefangen, mit python anzuschauen ;) ist schon irgendwie komisch. kenne fast jede programmiersprache, aber keine richtig. manchmal, macht es mich kirre, mich nicht entscheiden zu können, welche sprache, man nehmen soll. auf der arbeit nutze ist viel c# ( unter windows ), unter linux gefällt mir python bis jetzt sehr gut.
werde mir die doku dann mal genauer durch lesen, weil bis jetzt habe ich noch nicht genau verstanden, wie genau ich das modul nutze. nunja, mit mechanize, hast ja dann auch geklappt. aber wenne nen tipp hast, wie ichs am besten, mit dem modul, diese stelle finden könnte, wäre ich trotzdem dankbar. heißt nicht, das du mir die ganze arbeit abnehmen sollst. lerne ja auch fleißig dabei ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

The Hit-Man hat geschrieben:das werde ich mal versuchen. du scheinst es echt drauf zu haben mit python ;)
Naja, ich mahe mehr zu vielem eine Ahnung, aber zu nichts eine besonders fundierte Meinung ;)
The Hit-Man hat geschrieben:kenne fast jede programmiersprache, aber keine richtig. manchmal, macht es mich kirre, mich nicht entscheiden zu können, welche sprache, man nehmen soll. auf der arbeit nutze ist viel c# ( unter windows ), unter linux gefällt mir python bis jetzt sehr gut.
Naja, imperative Programmiersprachen verhalten sich oft alle sehr ähnlich (einzig die Typisierung ist ein größeres Merkmal was sie unterscheidet, und etwas syntaktischer Zucker) daher ist die Anzahl der verfügbaren, brauchbaren Libs ein wichtiger Faktor. Wenn du mal etwas neues ausprobieren willst, dann sieh dir doch Haskell an. Da hast du eine Sprache wo du trotz einiges an Programmiererfahrung trotzdem erstmal da stehst und keine Ahnung hast wie man die Probleme lösen kann. Alternativ auch einen Lisp-Dialekt wie Scheme oder Common Lisp, die haben wiederrum den Vorteil, dass Metaprogrammierung in diesen Sprachen kein Sonderfall sondern eher die Regel ist. Ist aber zugegebenermaßen schwerer, damit was "praktisches", realitätsnahes zu bauen (wobei Haskell laut hörensagen eine großartige Community hat, was man bei Lisp leider nicht immer sagen kann). Ein anderes Feld ist die logische Programmierung, aber da würde mir außer "ja, gucken wir mal wie das geht" kein nicht-akademischer Einsatzzweck einfallen :)
The Hit-Man hat geschrieben:aber wenne nen tipp hast, wie ichs am besten, mit dem modul, diese stelle finden könnte, wäre ich trotzdem dankbar. heißt nicht, das du mir die ganze arbeit abnehmen sollst. lerne ja auch fleißig dabei ;)
Wenn du das ausgegebene HTML mal (komplett) ins Lodgeit pastest, dann könnt ich mal sehen, was sich da machen lässt (allerdings ohne Garantie). Deine positive Lernhaltung nehme ich natürlich erfreut zur Kenntniss. :) Genau in solchen Fällen ist es oft sinnvoll, den Interpreter interaktiv zu verwenden, weil man dort eben alle möglichen Dinge ausprobieren kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja, die meisten sprachen, sind schon fast gleich, das stimmt wohl, kommt meist nur auf den syntax drauf an. allerdings, wenn ich an meine c64er und amiga zeit zurück denke, habe ich ja in assembler programmiert und die sprache, hat ja mal gar nichts, mit einer hochsprache zu tun. muß ganz ehrlich sagen, unter assembler, kam ich damals besser klar. liegt wohl daran, das der 6502 und der 68000 nur ne hand voll an befehlen hatte und man kaum module oder libs nutzen konnte. sieht heute alles anders aus. bis ich mir vorstellen konnte, wie man eine OO sprache, wie java, oder so nutze, ist ne ganze menge zeit vergangen ;)
nunja, aber hier nun zu dem problem. ich gebe dir dann mal die ganze seite mit, die ich ja dann ausgelesen hatte ( die ich durchsuchen wollte )

[Edit (Leonidas): Unvollständigen, unglaublich langen und kaputten HTML-Code gelöscht.]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

The Hit-Man hat geschrieben:ich gebe dir dann mal die ganze seite mit, die ich ja dann ausgelesen hatte ( die ich durchsuchen wollte )
Hmm, du hast den Teil "paste es ins Lodgeit" überlesen. PHPbb unterstützt keine so langen Posts und der Python-Highlighter hier wirft das Handtuch sogar schon früher.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

oh jeeee, das sagt mir gar nichts. was ist denn das? das ich das forum, fast schon so gesprengt hatte, ist mir auch schon aufgefallen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

The Hit-Man hat geschrieben:oh jeeee, das sagt mir gar nichts. was ist denn das?
Forumssuche hilft.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

aha ;) habs dann doch gefunden. die funktion habe ich noch in keinem forum gebraucht. also dann, sollte das der link sein

http://paste.pocoo.org/show/39914/

richtig?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das geht etwa so, mit lxml 2.0.3 und html5lib r1147 (da 0.10 noch nicht mit lxml 2 tut):

Code: Alles auswählen

import html5lib
from html5lib import treebuilders
parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder('lxml'))
f = open('olg.html')
doc = parser.parse(f)
f.close()
image = doc.findall("//*img[@src='http://image.onlineglueck.de/neu/main/mini_shortmessage.gif']")[0]
parent = image.getparent()
number = parent.getnext()
print number.text
Du kannst natürlich auch einen anderen Treebuilder verwenden, aber lxml ist wegen dem XPath und ``getparent()`` was es in ElementTree 1.2 (welches Teil von Python 2.5 ist) nicht gibt angenehmer zu nutzen als ET.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

danke, hat auch funktioniert ;) !!! werde mal nen bischen mit dem suchen, und dem modul rumspielen.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

*argh*
habe meinen rechner neu installiert, und jetzt plötzlich funktioniert der code mit dem parsen nicht mehr :( bekomme diese fehlermeldung. habe ich vergessen, was zu installieren?

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/hitman/python/WebOLG/test.py", line 3, in <module>
    parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder('lxml'))
  File "/var/lib/python-support/python2.5/html5lib/html5parser.py", line 52, in __init__
    self.tree = tree()
TypeError: 'NoneType' object is not callable
den code verstanden, habe ich ja. man sucht nach dem bildchen, nimmt davon den tag und läßt sich den nachvolgenden tag ausgeben ( wäre ja meine zahl, für die messages, die ich brauche ). aber wieso, bekomme ich jetzt eine fehlermeldung?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

The Hit-Man hat geschrieben:aber wieso, bekomme ich jetzt eine fehlermeldung?
Weil du die Release-Version von html5lib verwendest, die kommt mit lxml 2.x nicht klar. Das habe ich bereits oben geschrieben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Das geht etwa so, mit lxml 2.0.3 und html5lib r1147 (da 0.10 noch nicht mit lxml 2 tut):
jetzt google ich bestimmt schon 2h nach dieser versionsnummer: r1147, finde aber nur die 0.10-2, die ja dann nicht paßt, die ich momentan auch installiert habe. hatte sie als .deb nachinstalliert. wo kriege ich die denn her? muß ja kein .deb paket sein, nen py setup reicht ja auch. nach einer hompage hatte ich auch schon vercusht zu suchen, aber finde leider nicht :(
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Homepage, unter Source gibt es auch eine Anleitung, wie du einen SVN Checkout herbekommst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

genau, auf der seite war ich auch schon, und gerade jetzt verläßt mich mein synaptic, aptitude und auch apt-get um den svn krämpel zu installieren :( gibts auf die schnelle keine andere möglichkeit?
by the way, hatte mir auch heute BeautifulSoup mal angeschaut. da muß ich allerdings sagen, das dein code verständlicher war, deshalb würde ich auch gerne dabei bleiben. hätte nicht gedacht, das das svn so ne arbeit ist ( habe ich noch nie gebraucht ).
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

The Hit-Man hat geschrieben:genau, auf der seite war ich auch schon, und gerade jetzt verläßt mich mein synaptic, aptitude und auch apt-get um den svn krämpel zu installieren :(
Wo ist denn das Problem? ``aptitude install subversion``
The Hit-Man hat geschrieben:by the way, hatte mir auch heute BeautifulSoup mal angeschaut.
Damit ists auch möglich, allerdings verhält sich BeautifulSoup meiner meinung nach manchmal etwas seltsam, daher hab ich diesmal auf html5lib und lxml zurückgegriffen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Wo ist denn das Problem? ``aptitude install subversion``
die server hatten nicht geantwortet. bekam immer nen timeout. jetzt scheint es wieder zu gehen. habs mal installiert, wie gesagt, noch nie gebraucht, aber werde das wohl hinbekommen. bin mal gespannt, wie und was ich dann da runter bekomme.

heißt das nicht apt-get install subversion ;)?

*EDIT*
habe alles runterbekommen und ließ sich auch installieren, war nen setup.py dabei.
Antworten