Comment puis-je obtenir des liens href à partir de HTML en utilisant Python?

import urllib2

website = "WEBSITE"
openwebsite = urllib2.urlopen(website)
html = getwebsite.read()

print html

pour l'instant tout va bien.

mais je ne veux que les liens href du texte HTML. Comment puis-je résoudre ce problème?

31
demandé sur dreftymac 2010-06-19 16:58:08

6 réponses

Essayez avec 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')

dans le cas où vous voulez juste des liens commençant par http:// , vous devez utiliser:

soup.findAll('a', attrs={'href': re.compile("^http://")})
73
répondu systempuntoout 2010-06-19 13:13:21

vous pouvez utiliser le module HTMLParser .

le code ressemblerait probablement à quelque chose comme ceci:

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)

Note: le module HTMLParser a été renommé en html.parser en Python 3.0. L'outil 2to3 adaptera automatiquement les importations lors de la conversion de vos sources à 3.0.

27
répondu Stephen 2010-06-19 13:02:24

regardez l'utilisation de la bibliothèque de parsing belle soupe html.

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

vous allez faire quelque chose comme ça:

import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html)
for link in soup.findAll("a"):
    print link.get("href")
10
répondu Peter Lyons 2014-03-04 15:27:56

ma réponse craint probablement par rapport aux vrais gourous là-bas, mais en utilisant quelques mathématiques simples, le tranchage de chaîne, trouver et urllib, ce petit script va créer une liste contenant des éléments de lien. Je teste google et ma sortie semble correcte. Espérons que cela aide!

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
6
répondu 0xhughes 2013-02-15 05:05:14

utiliser BS4 pour cette tâche spécifique semble exagéré.

Essayez plutôt:

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))

j'ai trouvé ce joli morceau de code sur http://www.pythonforbeginners.com/code/regular-expression-re-findall et fonctionne très bien pour moi.

Je l'ai testé seulement sur mon scénario d'extraire une liste de fichiers à partir d'un dossier web qui expose les fichiers\folder dedans, par exemple:

enter image description here

et j'ai eu une liste triée des dossiers\dossiers sous L'URL

3
répondu RaamEE 2017-09-20 11:09:29

Voici une version paresseuse de la réponse de @stephen

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

utilisez - le comme ceci:

>>> parser = LinkParser()
>>> f = urlopen('http://stackoverflow.com/questions/3075550')
>>> links = gen_links(f, parser)
>>> next(links)
'//stackoverflow.com'
2
répondu reubano 2017-01-15 17:58:42