Hier ist eine faule Version von @ Stephans Antwort
from urllib.request import urlopen
from itertools import chain
from html.parser import HTMLParser
class LinkParser(HTMLParser):
def reset(self):
HTMLParser.reset(self)
self.links = iter([])
def handle_starttag(self, tag, attrs):
if tag == 'a':
for name, value in attrs:
if name == 'href':
self.links = chain(self.links, [value])
def gen_links(f, parser):
encoding = f.headers.get_content_charset() or 'UTF-8'
for line in f:
parser.feed(line.decode(encoding))
yield from parser.links
Verwenden Sie es wie folgt:
>>> parser = LinkParser()
>>> f = urlopen('http://stackoverflow.com/questions/3075550')
>>> links = gen_links(f, parser)
>>> next(links)
'//stackoverflow.com'
BeautifulSoup kann zum Beispiel 'meta' Tags nicht automatisch schließen.Das DOM-Modell ist ungültig und es gibt keine Garantie, dass Sie finden, wonach Sie suchen. – Antonio
ein anderes problem mit bsoup ist, das format der verbindung wird von seinem ursprünglichen ändern. Also, wenn Sie den ursprünglichen Link ändern möchten, um auf eine andere Ressource zu verweisen, habe ich im Moment noch keine Ahnung, wie Sie das mit bsoup machen. Irgendein Vorschlag? – swdev
Nicht alle Links enthalten 'http'. Wenn Sie beispielsweise Ihre Site so programmieren, dass das Protokoll entfernt wird, beginnen die Links mit '//'. Dies bedeutet, dass Sie jedes Protokoll verwenden müssen, mit dem die Site geladen ist (entweder "http:' oder "https:'). – reubano