Relative Links in absolute Links umwandeln? :(

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
mc_mak
User
Beiträge: 9
Registriert: Freitag 4. August 2006, 11:17

Hallo zusammen,

gibt es eine Möglichkeit, eine per urlopen eingelesene Webseite so zu verändern, dass die enthaltenen Verweise nicht mehr relativ, sondern absolut sind. Die Problemstellung ist also so, dass man einen string hat, der den Quellcode der Webseite enthält. Dann benötige ich ein entsprechendes Python-Skript, das die die relativen Links erkennt und durch absolute ersetzt. Die Variante mit BeautifulSoup, jeden Link zu ersetzen, dauert bei umfangreicheren Seiten extrem lange. Schön wäre eine alternative Lösung, bei der die Performance besser wäre, aber ich fürchte, das wird wohl so gar nicht möglich sein. Falls doch bin ich für alle Tipps dankbar.

Viele Grüße,

Makmak
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Makmak!

Ich glaube, *HTTrack* kann so etwas. Allerdings ist das kein Python-Programm.

http://www.httrack.com/

Dann gibt es noch *httrack-py* http://www.satzbau-gmbh.de/staff/abel/httrack-py/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Nicht getestet, sollte aber seinen Zweck erfüllen:

Code: Alles auswählen

import re
import urlparse

tag_re = re.compile(r'(<[a-zA-Z:]+\s+(?:src|href)=)(["\']?)(.*?)\2(>)(?uism)')

def make_absolute(html, root_url):
    def handle_match(m):
        url = urlparse.urljoin(root_url, m.group(3))
        g = m.group
        return type(html)('').join((g(1), g(2), url, g(2), g(4)))
    return tag_re.sub(handle_match, html)
Verwendung etwa so:

Code: Alles auswählen

make_absolute(html, 'http://www.example.com/this_location/')
TUFKAB – the user formerly known as blackbird
Antworten