wake-up-neo.com

Wie kann ich mit Python Href-Links aus HTML erhalten?

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? 

35
user371012

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://")})
78
systempuntoout

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.

28
Stephen

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")
12
Peter Lyons

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 .:

 enter image description here

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

7
RaamEE

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
5
0xhughes

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'
2
reubano

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

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.

0
sak

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