Links aus einer HTML Datei lesen...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Hallo,

mir ist bewusst das diese Frage sicherlich schon des öfteren gestellt wurde.
Schließlich kam ich durch folgenden Thread schon recht weit: http://www.python-forum.de/viewtopic.ph ... &view=next

Nun habe ich jedoch folgendes Problem* Script anbei.
Jegliche Links sollen ausgegeben werden, die tatsächliche Ausgabe beinhaltet jedoch lediglich:
Name: Navigation, Link: #mw-head
Irgendwie stehe ich just auf dem Schlauch und dachte mir frage ich mal nach...

Code: Alles auswählen

from bottle import run, route
import urllib2
import cookielib
import re

@route('/')
def index():
	cj = cookielib.LWPCookieJar()
	opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
	opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10')]
	
	url1 = "http://de.wikipedia.org/wiki/Kategorie:Norwegische_Band"
	html = opener.open(url1).read()
	
	it = re.finditer(r"<[a].*href=[\"\'](.*?)[\"\'].*>(.*?)</[a]>", html, re.I)
	for m in it:
		return "Name: %s, Link: %s" % (m.group(2), m.group(1))
	
run(host='localhost', port=8080)
Weitere Informationsquelle: http://eshca.net/books/DE/python/python ... 15_002.htm


Würde mich sehr über Hinweise freuen...
Vielen Dank schon mal für eure Aufmerksamkeit!

Gruß
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Anstelle von einem RegExp solltest Du das richtige Werkzeug verwenden, nämlich einen HTML-Parser. Ich empfehle da mal HTML-Modul von `lxml` oder `html5lib`.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
jtk
User
Beiträge: 37
Registriert: Montag 19. November 2007, 17:16

Das ist ja auch ein link... (html sprungmarke)

Bau deine Regexp so um, dass sie eine gruppe ohne (#.*)? hat und prüfe dein ergebnis auf leerstring.
Das lässt sich auch gut mit einem htmlparser kombinieren, da hast du dann ken problem miz z.b. htmk kommentaren
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Vielen Dank um den Hinweis zu den html Parser, dies nehme ich gern genauer unter die Lupe.

Natürlich auch vielen Dank um den Hinweis mit dem Leerstring bezüglich Kommentare.
Was mich wundert ist das er nur diesen einen Link ausgegeben hat und nicht alle... :K
Aber Gut Parser? Her damit! Vielen Dank, Juche.


Greatz
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

seishin hat geschrieben:Was mich wundert ist das er nur diesen einen Link ausgegeben hat und nicht alle... :K
Das liegt daran, dass bei `return` die Funktion verlassen wird, und dann bei deiner Schleife nur einmal `return` ausgeführt werden kann. Du solltest eher alle Links in einer Liste speichern und dann "".join(liste) zurückgeben.
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Asche auf mein Haupt!
Da sind sie die Tomaten auf den Augen. :shock:
Wie peinlich...

Danke-sehr...
Lenzer
User
Beiträge: 9
Registriert: Dienstag 13. Dezember 2011, 04:20

Konntest du das Problem beheben? Wie hast du das gemacht
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Hoi,

wir hatten dann solch Spielereien begonnen: https://github.com/maitee/LeporelloScraper


Gruß und sorry das ich erst so spät antwortete.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Weil ich erst neulich Links aus einem Dokument auslesen musste:

Code: Alles auswählen

from lxml import html

tree = html.parse('http://foo/bar.html')
for element, attribute, link, pos in tree.getroot().iterlinks():
    # aktion
einfach, ne?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

seishin hat geschrieben:wir hatten dann solch Spielereien begonnen: https://github.com/maitee/LeporelloScraper
Uhm, warum hat das so eine seltsame Paketstruktur? Seid ihr sicher, dass ihr Python nutzt und nicht Java?

Edit: Ich les jetzt auch den Code, und hab immer mehr das Gefühl dass da jemand Python is not Java nicht gelesen hat. Der Code strotzt so von Java-ismen, denke man kann ihn in Python so auf 1/3 Länge eindampfen. Ein wichtiger Satz draus:
PJE hat geschrieben:Take a step back, and above all, stop writing so much code.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

Ich bediene mich an sich nur an der beautifull soup kenne aber maitee sehr gut und werde ihm deine Anmerkungen zukommen lassen.

Du hast mit deiner Vermutung recht, maitee kommt aus der Java Welt und ist sehr begeistern von Eclipse.

Mit verbindlichsten Dank.
Antworten