Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Hey Leute,
ich habe (wieder einmal) eine Frage wegen re...
Hier zum Problem: Ich habe einen String mit dem Quelltext einer zuvor geöffneten Seite. Ich möchte aus diesem String alle Links raussuchen(also nur die verlinkte Seite, nicht das ganze mit <a href=...> sondern nur die Seite hinter dem a href ). Das macht man ja normalerweise mit re.findall(). Dafür bin ich allerdings zu dumm... Könnt ihr mir da helfen? Die Links sollen am besten in einem Array gespeichert werden
Danke schonmal im Vorraus
PS: Ich möchte keine 3rd Party Module benutzen, also bitte empfehlt mir nicht Beautiyful Soup und co...
Stegi95 hat geschrieben:Hey Leute,
ich habe (wieder einmal) eine Frage wegen re...
Hier zum Problem: Ich habe einen String mit dem Quelltext einer zuvor geöffneten Seite. Ich möchte aus diesem String alle Links raussuchen(also nur die verlinkte Seite, nicht das ganze mit <a href=...> sondern nur die Seite hinter dem a href ). Das macht man ja normalerweise mit re.findall(). Dafür bin ich allerdings zu dumm... Könnt ihr mir da helfen? Die Links sollen am besten in einem Array gespeichert werden
Bei re.findall() werden die Treffer schon als Array gespeichert.
Du könntest sowas in der Art machen:
Eigentlich kann man mit regulären Ausdrücken nicht vernünftig HTML parsen. Wenn du weißt, dass deine Eingabe gültiges XHTML ist, könntest du Pythons eingebauten XML-Parser benutzen. Reguläre Ausdrücke können nur ein Notbehelf sein. Hier ein Beispiel für Python 3.1. Beachte, dass die gefundene URL noch Entities (z.B. &) enthalten kann, die noch entfernt werden müssten.
import re, urllib.request
from urllib.parse import urljoin
b = "http://python-forum.de"
s = urllib.request.urlopen(b).read().decode('utf-8')
def get_a(b, s):
for m in re.finditer(r"""(?is)<a[^>]*href[\s\n]*=[\s\n]*("[^"]*"|'[^']*')""", s):
yield urljoin(b, m.group(1)[1:-1])
print(list(get_a(b, s)))
Stefan
Zuletzt geändert von sma am Samstag 20. November 2010, 11:30, insgesamt 1-mal geändert.
@OP: "lxml.html" sollte dennoch erwähnt werden, auch wenn Du keine Drittmodule nutzen möchtest. Es ist die beste Lösung zur Arbeit mit HTML, und bietet insbesondere auch komfortable Methoden für Verarbeitung von Links.
import xml.parsers.expat
def start_element(name, attrs):
if name == 'a':
links.append(attrs['href'])
links = []
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = start_element
with open("irgendeine_datei.xml", "r") as f:
p.Parse(f.read())
lunar hat geschrieben:@nomnom: Verwende statt expat, sax oder minidom doch ElementTree.
Wieso denn? Tu ich nicht, wenn mir nicht gesagt wird wieso
Ist auch in diesem Fall kein guter Tipp, denn alles DOM-artige saugt sich das gesamte Dokument in den Hauptspeicher, was zum Finden von a[href] nun wirklich nicht notwendig ist. Hier ist das SAX-API auch nicht wirklich kompliziert zu benutzen.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from xml.etree import ElementTree as etree
def main():
result = list()
for _type, node in etree.iterparse('test.xml', ['start']):
if node.tag == 'a':
result.append(node.get('href'))
print result
if __name__ == '__main__':
main()
Aber, was kann ich tun, wenn ich nicht weiß, ob die Seite valides XHTML ist? Wenn ich zum Beispiel die Seiten automatisch aufrufen lasse, und dann scnnen lasse...dann weiß ich ja nicht, ob es gutes, reines XHTML ist.
Danke aber schonmal an alle, das geht wirklich fix hier
import xml.etree.ElementTree
tree = xml.etree.ElementTree.parse("beispiel.xml")
links = tree.getiterator("a")
for link in links:
print link.get("href")
Stegi95 hat geschrieben:Aber, was kann ich tun, wenn ich nicht weiß, ob die Seite valides XHTML ist? Wenn ich zum Beispiel die Seiten automatisch aufrufen lasse, und dann scnnen lasse...dann weiß ich ja nicht, ob es gutes, reines XHTML ist.
Ein nicht valides XML-Dokument muss einen validierenden XML-Parser einen Fehler werfen lassen. Daran kann man's dann erkennen. Nützen tut es natürlich recht wenig, wenn man trotzdem die Links ermitteln will. Dann hilft vielleicht immer noch der reguläre Ausdruck.
Ja. Oder echt mal lxml.html oder zumindest html5lib nutzen. Letztere benötigt auch keinen C-Code, kann also der Applikation zur Not mitgeliefert werden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice