2010-06-19 7 views

Antwort

66

Versuchen mit Beautifulsoup:

from BeautifulSoup import BeautifulSoup 
import urllib2 
import re 

html_page = urllib2.urlopen("http://www.yourwebsite.com") 
soup = BeautifulSoup(html_page) 
for link in soup.findAll('a'): 
    print link.get('href') 

Falls Sie gerade erst anfangen Links mit http://, sollten Sie verwenden:

soup.findAll('a', attrs={'href': re.compile("^http://")}) 
+0

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

+0

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

+0

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

23

Sie können das Modul HTMLParser verwenden.

Der Code würde wahrscheinlich so etwas wie folgt aussehen:

from HTMLParser import HTMLParser 

class MyHTMLParser(HTMLParser): 

    def handle_starttag(self, tag, attrs): 
     # Only parse the 'anchor' tag. 
     if tag == "a": 
      # Check the list of defined attributes. 
      for name, value in attrs: 
       # If href is defined, print it. 
       if name == "href": 
        print name, "=", value 


parser = MyHTMLParser() 
parser.feed(your_html_string) 

Hinweis: Das HTMLParser Modul html.parser in Python 3.0 umbenannt wurde. Das 2to3-Tool passt Importe automatisch an, wenn Sie Ihre Quellen in 3.0 konvertieren.

+0

Ich komme zu der Erkenntnis, dass, wenn ein Link das spezielle HTML-Zeichen wie '&' enthält, es in seine textuelle Repräsentation umgewandelt wird, wie '&' in diesem Fall. Wie konservierst du die ursprüngliche Zeichenkette? – swdev

+1

I likte diese Lösung am besten, da sie keine externen Abhängigkeiten benötigt – DomTomCat

9

Blick auf die schöne Suppe HTML-Parsing-Bibliothek.

http://www.crummy.com/software/BeautifulSoup/

Sie so etwas tun:

import BeautifulSoup 
soup = BeautifulSoup.BeautifulSoup(html) 
for link in soup.findAll("a"): 
    print link.get("href") 
+0

Danke! Aber benutze 'link' statt' a'. – Evgenii

6

Meine Antwort kotzen wahrscheinlich im Vergleich zu den echten Gurus gibt, aber einige einfache mathematische, string Slicing Verwendung finden und urllib dieses kleine Das Skript erstellt eine Liste mit Verknüpfungselementen. Ich teste Google und meine Ausgabe scheint richtig. Ich hoffe es hilft!

import urllib 
test = urllib.urlopen("http://www.google.com").read() 
sane = 0 
needlestack = [] 
while sane == 0: 
    curpos = test.find("href") 
    if curpos >= 0: 
    testlen = len(test) 
    test = test[curpos:testlen] 
    curpos = test.find('"') 
    testlen = len(test) 
    test = test[curpos+1:testlen] 
    curpos = test.find('"') 
    needle = test[0:curpos] 
    if needle.startswith("http" or "www"): 
     needlestack.append(needle) 
    else: 
    sane = 1 
for item in needlestack: 
    print item 
2

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' 
1

BS4 Verwendung für diese spezifische Aufgabe Overkill scheint. stattdessen

Versuchen:

website = urllib2.urlopen('http://10.123.123.5/foo_images/Repo/') 
html = website.read() 
files = re.findall('href="(.*tgz|.*tar.gz)"', html) 
print sorted(x for x in (files)) 

fand ich dieses raffinierte Stück Code auf http://www.pythonforbeginners.com/code/regular-expression-re-findall und arbeitet für mich ganz gut.

Getestet habe ich es nur auf meinem Szenario eine Liste von Dateien von einem Web-Ordner zu extrahieren, die die Dateien \ Ordner in sie setzt, zum Beispiel:

enter image description here

und ich bekam eine sortierte Liste der Dateien \ Ordner unter der URL

Verwandte Themen