Seite 1 von 1

Finden und Kopieren

Verfasst: Samstag 22. August 2009, 18:54
von Mathe
Hiho,

Also zur Zeit habe ich folgendes Problem.

Ich lade mir eine Webseite mit urlretrieve () runter und speichere sie in einem html Dokument ab. Dieses möchte ich dann gerne durchsuchen.

Was ich suchen möchte:

Ich habe es mir so gedacht, dass ich erst etwas suche, was vor den Informationen steht die ich suche und dann etwas was nach den Informationen steht die ich suche. Alles dazwischen möchte ich dann "kopieren" (in Variablen speichern).

Nur leider hab ich überhaupt kein plan, wie ich das mit dem Suchen und Kopieren realisieren soll.

MfG

Verfasst: Samstag 22. August 2009, 19:07
von cofi
Stichwort RegExp. (Modul re)

Verfasst: Samstag 22. August 2009, 19:10
von BlackJack
@Mathe: Oder Du nimmst gleich einen richtigen HTML-Parser, wie zum `BeautifulSoup`.

Gibt's einen Grund, warum Du in eine Datei zwischenspeicherst, und nicht einfach nur die Daten in den Arbeitsspeicher liest?

Verfasst: Samstag 22. August 2009, 19:43
von Mathe
Tja das mit dem zwischenspeichern wollte ich machen, weil ich die auf die Datei noch mit anderen programmen zugreifen wollte. Aber das hat sich jetzt erstmal erledigt.

Gibt es für beautiful soup auch ne deutsche documentation?

Verfasst: Samstag 22. August 2009, 20:01
von cofi
Mathe hat geschrieben:deutsche documentation?
Na wenn das keine Stilbluete ist :twisted:

Nein, so weit ich weiss wird es auch nicht weiter entwickelt (hat aber bei lxml Unterschlupf gefunden).
Im Uebrigen ist deutsche Dokumentation schwer zu finden und meist nicht aktuell.
http://www.python-forum.de/topic-17375.html

Verfasst: Samstag 22. August 2009, 20:55
von Mathe
"<span id="ctl00_ContentBody_LogHeading">Tracking History (33.8mi) <a href="./map_gm.aspx?ID=2342529">View Map</a></span></h3>"

Das ist meine Zeile die ich aus dem Quellcode finden möchte. Daraus möchte ich dann gerne "Tracking History (33.8mi)" (Dieser Wert variert von mal zu mal) lesen und in eine Variable schreiben. Nur irgendwie schaff ich es nicht mit beautiful soup den zu finden...Kann mir da wer helfen?

Verfasst: Sonntag 23. August 2009, 11:16
von Leonidas
cofi hat geschrieben:Nein, so weit ich weiss wird es auch nicht weiter entwickelt (hat aber bei lxml Unterschlupf gefunden).
Wie meinen? lxml ist ein Ersatz für BeautifulSoup und macht so ziemlich alles anders was man anders machen kann ;)

Verfasst: Sonntag 23. August 2009, 11:45
von cofi
Ich dachte der Entwickler haette keine Lust mehr gehabt und lxml hat sich dessen angenommen: http://codespeak.net/lxml/elementsoup.html

Oder erinner ich mich da falsch?

Verfasst: Sonntag 23. August 2009, 12:08
von Leonidas
Das bindet doch nur BeautifulSoup an. BeautifulSoup bleibt dabei trotzdem ein separates Modul und Projekt.

Verfasst: Sonntag 23. August 2009, 12:09
von lunar
"lxml.html.soupparser" und "lxml.html.elementsoup" sind kein Ersatz für BeautifulSoup. Im Gegenteil, sie setzen BeautifulSoup sogar voraus. "lxml.html.soupparser" nutzt BeautifulSoup, um HTML in "lxml.html"-Datenstrukturen zu übersetzen (genau wie "lxml.html.html5parser" html5lib benutzt). Somit kann man den Parser auswechseln, ohne eine andere API benutzen zu müssen.

"lxml.html.elementsoup" dagegen ist die lxml-Implementierung von ElementSoup. Das hat sich aber wohl nie wirklich durchgesetzt, die Dokumentation bezeichnet "lxml.html.elementsoup" daher auch "legacy".

Verfasst: Sonntag 23. August 2009, 12:16
von Mathe
Mathe hat geschrieben:"<span id="ctl00_ContentBody_LogHeading">Tracking History (33.8mi) <a href="./map_gm.aspx?ID=2342529">View Map</a></span></h3>"

Das ist meine Zeile die ich aus dem Quellcode finden möchte. Daraus möchte ich dann gerne "Tracking History (33.8mi)" (Dieser Wert variert von mal zu mal) lesen und in eine Variable schreiben. Nur irgendwie schaff ich es nicht mit beautiful soup den zu finden...Kann mir da wer helfen?
Ok jetzt hab ich wieder ien bisschen dazugelernt, aber mein Problem ist immernoch nicht gelöst...

Verfasst: Sonntag 23. August 2009, 14:15
von BlackJack
@Mathe: Wenn das `id`-Attribut eindeutig ist, wäre das doch schon mal ein schöner Ansatzpunkt, um die Stelle zu finden. Damit kommst Du an das `span`-Element und von da recht einfach an den Text.

Verfasst: Sonntag 23. August 2009, 14:37
von cofi
Mal eine recht fragile Version mit RegExp (fuer etwas stabileres braucht man mehr Infos)

Code: Alles auswählen

In [17]: import re

In [18]: text = """<span id="ctl00_ContentBody_LogHeading">Tracking History (33.8mi) <a href="./map_gm.aspx?ID=2342529">View Map</a></span></h3>"""

In [19]: a = re.search(r"Tracking History \(.*?\)", text)

In [20]: a.group()
Out[20]: 'Tracking History (33.8mi)'

Verfasst: Sonntag 23. August 2009, 17:11
von Mathe
Perfekt :D

Also ich hab das ganze jetzt so geschrieben:

Code: Alles auswählen

from urllib import *
import re

url = "x"
datei = urlretrieve (url, "y") 

text = open ("y", "r").read()

a = re.search("Tracking History \(.*?\)", text)
print a.group()
So funktioniert das genauso, wie es soll. Zwar ist das script vielleicht nicht die schnellste Methode, aber ich komme ans Ziel :D