Seite 1 von 1
Links extrahieren mit SGMLLib
Verfasst: Dienstag 13. Dezember 2005, 21:32
von rabby
hallo welt!
bin einsteiger in python und will in meinem aktuellen testscript alle urls einer html seite zuverlässig extrahieren.
habe lange mit regexp herumexperimentiert und will es nun noch mit dem parser von sgmllib versuchen. allerdings will das nicht so einfach klappen:
Code: Alles auswählen
class LinkExtractor(SGMLParser):
def __init__(self):
self.links = []
SGMLParser.__init__(self)
def do_a(self, attributes):
for (name, value) in attributes:
if name == "href":
value = cleanlink(value)
if value:
self.links.append(value)
def getlinks(self):
return self.links
def get_links(src):
parser=LinkExtractor()
parser.feed(src)
rueckgabe=parser.getlinks()
return rueckgabe
könnte mir bitte jemand helfen, sodass die klasse wirklich funktionsfähig ist oder wie könnte man das einfacher schreiben? konnte keine funktionsfähigen beispiele finden

danke für Eure hilfe
Re: Links extrahieren mit SGMLLib
Verfasst: Dienstag 13. Dezember 2005, 23:17
von gerold
rabby hat geschrieben:alle urls einer html seite zuverlässig extrahieren.
Hi!
So etwas würde ich mit **BeautifulSoup** machen. Zu finden unter
http://www.crummy.com/software/BeautifulSoup/.
Hier ein kleines Beispiel, das aufzeigt wie einfach so etwas mit dem richtigen Werkzeug sein kann.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from BeautifulSoup import BeautifulSoup
html = """<html>
<head>
<title>Hallo Welt</title>
</head>
<body>
<p>
<a href="http://www.bcom.at">Bcom</a>
<a href="http://gerold.bcom.at">Gerold</a>
</p>
<p>
<a href="http://sw3.at">SW3</a>
</p>
</body>
</html>
"""
soup = BeautifulSoup(html)
# Alle Links raus suchen:
for anker in soup("a"):
print "Text:", anker.string
print "Href:", dict(anker.attrs)["href"]
mfg
Gerold

Verfasst: Mittwoch 14. Dezember 2005, 17:49
von rabby
danke!
irgendwie gibt es probleme z.b. beim aufruf von ip-ermitteln.de

was kann ich hierbei tun?
Verfasst: Mittwoch 14. Dezember 2005, 19:40
von gerold
rabby hat geschrieben:irgendwie gibt es probleme z.b. beim aufruf von ip-ermitteln.de

was kann ich hierbei tun?
Hi rabby!
Wer kann denn ahnen, dass es so schrecklich formatierte Seiten gibt
Das Skript bleibt stehen, weil es einen Link findet, der kein "href"-Attribut besitzt.
Einfach diese Zeile ändern:
Mit einer guten IDE, mit der man auch debuggen kann, wärst du selber drauf gekommen.
KeyError: href
deutet darauf hin, dass der Key
href nicht gefunden werden konnte.
mfg
Gerold

Verfasst: Mittwoch 14. Dezember 2005, 22:21
von Torsten2005
mm?
also warum geht das nicht so:
Code: Alles auswählen
link=findall('<a href=".+">', Stringwodertextdrinist)
liste=liste+['link']
Verfasst: Donnerstag 15. Dezember 2005, 00:50
von BlackJack
Weil Du damit nicht alle Links findest. Erstens bekommst Du Probleme wenn in der gleichen Zeile nach dem ersten Link noch irgendwo ein `">` folgt weil reguläre Ausdrücke normalerweise "greedy" sind, also versuchen so viel wie möglich zu erkennen:
Code: Alles auswählen
In [10]: re.findall('<a href=".+">', '<a href="foo"> <div id="bar">')
Out[10]: ['<a href="foo"> <div id="bar">']
Das lässt sich mit einem Fragezeichen leicht beheben:
Code: Alles auswählen
In [11]: re.findall('<a href=".+?">', '<a href="foo"> <div id="bar">')
Out[11]: ['<a href="foo">']
Bleiben aber noch tausend andere Alternativen die nicht erkannt werden. Zum Beispiel wenn noch weitere Attribute im a-Tag sind, oder wenn statt der doppelten, einzelne Anführungszeichen, oder gar keine benutzt wurden.
Verfasst: Donnerstag 15. Dezember 2005, 02:20
von gerold
Damit folgender Thread, der ja erst durch dieses Thema entstanden ist, nicht unter geht:
http://www.python-forum.de/viewtopic.php?p=27720
lg
Gerold
