2 Stimmen

Innerhalb von HTML, URL-Remap-Bibliothek in Python

Mit URL-Neuzuordnung meine ich das Ändern aller "href "s und "src "s und "action "s und ... innerhalb eines tatsächlichen HTML-Dokuments.

Gibt es irgendwelche Python-Bibliotheken, um diese Art von URL-Remapping zu tun?

Auf einer Python-Webserver-Anwendung (basierend auf Tornado) möchte ich in der Lage sein, den HTML-Code zu ändern, den ich auf der Grundlage einiger Bedingungen verwende.

Stellen Sie sich vor, ich lese diese HTMLs von der Festplatte, aber ich muss alle Links und ... ersetzen, um auf diese Subdomäne/Domäne und den Pfad oder die zu verweisen.

Nehmen wir an, ich möchte keine Vorlagen verwenden, um das gesamte HTML umzuschreiben, das ich auf der Festplatte habe (um Tags einzufügen und die Tags zur Laufzeit zu ersetzen), und stellen wir uns der Einfachheit halber vor, dass ich keine externen Links habe (z. B. verweise ich nie auf google.com [was eine bedingte Neuzuordnung erfordert]).

4voto

reclosedev Punkte 9172

Soweit ich weiß, gibt es keine solche Bibliothek, aber Sie können einige HTML-Parsing-Bibliothek wie verwenden lxml o BeautifulSoup zusammen mit urlparse Standard-Python-Mauser. Ich bevorzuge die Verwendung von lxml et XPath .

Wir haben zum Beispiel die StackOverflow-Seite als doc.html und wir wollen etwas mit Knoten machen, die Folgendes enthalten href , src , actions :

import urlparse

import lxml.html

with open('doc.htm') as f:
    doc = lxml.html.parse(f)

for el in doc.xpath('//*[@href | @src | @action]'):
    tag = el.tag
    href = el.get('href', '')
    if not href:
        continue

    # not really need to check for '/' when using urljoin, but this is just example
    if href.startswith('/'): 
        el.attrib['href'] = urlparse.urljoin('http://stackoverflow.com/', href)

# then get string representation of tree back
result = lxml.html.tostring(doc)

In diesem Beispiel konvertiere ich nur relative href die mit '/' beginnen, in absolute Werte umwandeln. urlparse.urljoin und nicht alle Elemente aus dem XPath-Ergebnis verwendet. Aber Sie können es für Ihre Bedürfnisse anpassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X