Par souci d'exhaustivité, la version BeautifulSoup 4, qui utilise également l'encodage fourni par le serveur :
from bs4 import BeautifulSoup
import urllib.request
parser = 'html.parser' # or 'lxml' (preferred) or 'html5lib', if installed
resp = urllib.request.urlopen("http://www.gpsbasecamp.com/national-parks")
soup = BeautifulSoup(resp, parser, from_encoding=resp.info().get_param('charset'))
for link in soup.find_all('a', href=True):
print(link['href'])
ou la version Python 2 :
from bs4 import BeautifulSoup
import urllib2
parser = 'html.parser' # or 'lxml' (preferred) or 'html5lib', if installed
resp = urllib2.urlopen("http://www.gpsbasecamp.com/national-parks")
soup = BeautifulSoup(resp, parser, from_encoding=resp.info().getparam('charset'))
for link in soup.find_all('a', href=True):
print link['href']
et une version utilisant le requests
bibliothèque qui, tel qu'il est écrit, fonctionnera à la fois dans Python 2 et 3 :
from bs4 import BeautifulSoup
from bs4.dammit import EncodingDetector
import requests
parser = 'html.parser' # or 'lxml' (preferred) or 'html5lib', if installed
resp = requests.get("http://www.gpsbasecamp.com/national-parks")
http_encoding = resp.encoding if 'charset' in resp.headers.get('content-type', '').lower() else None
html_encoding = EncodingDetector.find_declared_encoding(resp.content, is_html=True)
encoding = html_encoding or http_encoding
soup = BeautifulSoup(resp.content, parser, from_encoding=encoding)
for link in soup.find_all('a', href=True):
print(link['href'])
Le site soup.find_all('a', href=True)
l'appel trouve tout <a>
qui ont un href
Les éléments sans cet attribut sont ignorés.
Le développement de BeautifulSoup 3 a été interrompu en mars 2012 ; les nouveaux projets doivent impérativement utiliser BeautifulSoup 4, toujours.
Notez que vous devez laisser le décodage du HTML à partir des octets à BeautifulSoup . Vous pouvez informer BeautifulSoup du jeu de caractères présent dans les en-têtes de la réponse HTTP pour faciliter le décodage, mais cette information n'est pas disponible. peut être erronée et en conflit avec une <meta>
qui se trouve dans le HTML lui-même, c'est pourquoi l'exemple ci-dessus utilise la méthode de la classe interne BeautifulSoup EncodingDetector.find_declared_encoding()
pour s'assurer que de tels indices d'encodage intégrés l'emportent sur un serveur mal configuré.
Avec requests
le response.encoding
La valeur par défaut de cet attribut est Latin-1 si la réponse a un caractère text/*
mimetype, même si aucun jeu de caractères n'a été renvoyé. Ceci est cohérent avec les RFCs HTTP mais douloureux lorsqu'il est utilisé avec l'analyse HTML, donc vous devriez ignorer cet attribut lorsqu'aucun fichier charset
est défini dans l'en-tête Content-Type.
0 votes
Voici un extrait de code mis à jour qui fait exactement ce que vous demandez en 30 lignes. github.com/mujeebishaque/extract-urls
0 votes
J'ai essayé ceci pour un lien et j'ai obtenu des résultats comme ceci
/info-service/downloads/#unserekataloge'
. N'est-il pas possible d'obtenir le lien complet accessible ? et pas seulement une partie du sous-lien ? Je veux obtenir les liens vers tous les pdfs disponibles sur le site @MujeebIshaque