import urllib2
website = "WEBSITE"
openwebsite = urllib2.urlopen(website)
html = getwebsite.read()
print html
So weit, ist es gut.
Ich möchte aber nur href Links aus dem Klartext-HTML. Wie kann ich dieses Problem lösen?
Versuchen Sie es 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')
Wenn Sie nur Links mit http://
beginnen möchten, sollten Sie Folgendes verwenden:
soup.findAll('a', attrs={'href': re.compile("^http://")})
Sie können das Modul HTMLParser verwenden.
Der Code würde wahrscheinlich so 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 wurde in Python 3.0 in html.parser umbenannt. Das 2to3-Tool passt Importe automatisch an, wenn Sie Ihre Quellen auf 3.0 konvertieren.
Schauen Sie sich die schöne Suppe-HTML-Parsing-Bibliothek an.
http://www.crummy.com/software/BeautifulSoup/
Sie werden so etwas tun:
import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html)
for link in soup.findAll("a"):
print link.get("href")
Die Verwendung von BS4 für diese spezielle Aufgabe scheint übertrieben zu sein.
Versuchen Sie stattdessen:
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))
Ich habe dieses schicke Stück Code auf http://www.pythonforbeginners.com/code/regular-expression-re-findall gefunden und funktioniert für mich ganz gut.
Ich habe es nur in meinem Szenario getestet, in dem ich eine Liste von Dateien aus einem Webordner extrahierte, in dem sich der Ordner files\befindet, z. B .:
und ich habe eine sortierte Liste der Dateien\Ordner unter der URL
Meine Antwort ist wahrscheinlich im Vergleich zu den echten Gurus da draußen schlecht, aber mit ein paar einfachen Methoden wie String-Slicing, Find und Ullib wird dieses kleine Skript eine Liste mit Linkelementen erstellen. Ich teste google und meine Ausgabe scheint richtig zu sein. 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
Hier ist eine faule Version von @ Stephens 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'
Anforderungen mit BeautifulSoup und Python 3 verwenden:
import requests
from bs4 import BeautifulSoup
page = requests.get('http://www.website.com')
bs = BeautifulSoup(page.content, features='lxml')
for link in bs.findAll('a'):
print(link.get('href'))
Dies ist zu spät, aber für die neuesten Python-Benutzer funktioniert es:
from bs4 import BeautifulSoup
import requests
html_page = requests.get('http://www.example.com').text
soup = BeautifulSoup(html_page, "lxml")
for link in soup.findAll('a'):
print(link.get('href'))
Vergessen Sie nicht, " request " und " BeautifulSoup " zu installieren und auch " lxml " Verwenden Sie .text zusammen mit get. Andernfalls wird eine Ausnahme ausgelöst.
" lxml " wird verwendet, um die Warnung des verwendeten Parsers zu entfernen. Sie können auch " html.parser " verwenden, je nach Fall.
Diese Antwort ähnelt anderen mit requests
und BeautifulSoup
, verwendet jedoch das Listenverständnis.
Da find_all()
die beliebteste Methode in der Beautiful Soup-Such-API ist, können Sie soup("a")
als Verknüpfung von soup.findAll("a")
und unter Verwendung des Listenverständnisses verwenden:
import requests
from bs4 import BeautifulSoup
URL = "http://www.yourwebsite.com"
page = requests.get(URL)
soup = BeautifulSoup(page.content, features='lxml')
# Find links
all_links = [link.get("href") for link in soup("a")]
# Only external links
ext_links = [link.get("href") for link in soup("a") if "http" in link.get("href")]
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#calling-a-tag-is-like-calling-find-all