récupérer des liens à partir de la page web à l'aide de python et de BeautifulSoup
Comment puis-je extraire les liens d'une page web et de copier l'adresse url des liens à l'aide de Python?
Vous devez vous connecter pour publier un commentaire.
Comment puis-je extraire les liens d'une page web et de copier l'adresse url des liens à l'aide de Python?
Vous devez vous connecter pour publier un commentaire.
Voici un court extrait à l'aide de la SoupStrainer classe dans BeautifulSoup:
La BeautifulSoup la documentation est en fait assez bonne, et couvre un certain nombre de scénarios typiques:
http://www.crummy.com/software/BeautifulSoup/documentation.html
Edit: Notez que j'ai utilisé le SoupStrainer classe parce que c'est un peu plus performant (mémoire et de la vitesse sage), si vous savez ce que vous êtes d'analyse à l'avance.
/usr/local/lib/python2.7/site-packages/bs4/__init__.py:128: UserWarning: The "parseOnlyThese" argument to the BeautifulSoup constructor has been renamed to "parse_only."
has_attr
. Au lieu de cela je vois qu'il ya quelque chose appeléhas_key
et il fonctionne.hasattr
, un Python builtin:hasattr(link, "href")
Par souci d'exhaustivité, le BeautifulSoup 4 version, l'utilisation de l'encodage fourni par le serveur:
ou le Python 3 version:
et une version à l'aide de la
demande
de la bibliothèque, qui, comme l'écrit fonctionnent dans les deux Python 2 et 3:La
soup.find_all('a', href=True)
appel trouve tous<a>
éléments qui ont unehref
attribut; éléments sans l'attribut est ignoré.BeautifulSoup 3 développement arrêté en Mars 2012, de nouveaux projets devraient vraiment utiliser BeautifulSoup 4, toujours.
Noter que vous devez laisser le décodage du langage HTML à partir d'octets de BeautifulSoup. Vous pouvez vous informer BeautifulSoup de la characterset trouvé dans l'en-tête HTTP pour aider au décodage, mais ce peut être mauvais et est en conflit avec un
<meta>
en-tête infos trouvées dans le code HTML lui-même, qui est pourquoi la ci-dessus utilise la BeautifulSoup interne de la méthode de classeEncodingDetector.find_declared_encoding()
pour assurer que de telles intégré de codage des astuces gagner plus d'un problème de configuration du serveur.Avec
requests
, leresponse.encoding
attribut par défaut Latin-1 si la réponse a untext/*
mimetype, même si aucune characterset a été retourné. Ceci est cohérent avec le HTTP Rfc, mais douloureuse lorsqu'il est utilisé avec d'analyse HTML, de sorte que vous devez ignorer cet attribut lorsque aucunecharset
est défini dans l'en-tête Content-Type.D'autres ont recommandé BeautifulSoup, mais c'est beaucoup mieux d'utiliser lxml. Malgré son nom, il l'est aussi pour l'analyse et le grattage HTML. C'est beaucoup, beaucoup plus rapide que BeautifulSoup, et il prend même en charge "cassé" HTML mieux que BeautifulSoup (leur prétention à la célébrité). Il a une compatibilité de l'API pour BeautifulSoup aussi, si vous ne voulez pas apprendre le lxml API.
Ian Blicking accepte.
Il n'y a pas de raison d'utiliser BeautifulSoup plus, sauf si vous êtes sur Google App Engine ou quelque chose où ce qui n'est pas purement Python n'est pas autorisé.
lxml.html prend également en charge des sélecteurs CSS3, donc ce genre de chose est trivial.
Un exemple avec lxml et xpath devrait ressembler à ceci:
lxml
que la valeur par défaut de l'analyseur si installé.Sous le capot BeautifulSoup utilise maintenant lxml. Les demandes, lxml & interprétations de la liste fait un combo killer.
Dans la liste comp, le "si" //" et "url.com" pas de x" est une méthode simple pour nettoyer la liste des url des sites de l '"intérieur" de navigation les url, etc.
Le code suivant pour récupérer tous les liens disponibles dans une page web en utilisant
urllib2
etBeautifulSoup4
:Pourquoi ne pas utiliser des expressions régulières:
(r"<a.*?\s*href=\"(.*?)\".*?>(.*?)</a>", page)
signifie? merci!Pour trouver tous les liens, nous allons dans cet exemple utiliser le module urllib2
avec la ré.module
*L'un des plus puissants de la fonction dans le module re est "re.findall()".
Tout en ré.recherche() est utilisé pour trouver le premier match, pour un motif, re.findall() trouve tous
les matchs et les renvoie sous la forme d'une liste de chaînes de caractères, chaque chaîne de caractères représentant un match*
juste pour obtenir les liens, sans B. de la soupe et de la regex:
pour les opérations plus complexes, bien sûr BSoup est toujours préféré.
<a
ethref
? Direou
onclick="..."
ou même simplement une nouvelle ligne? stackoverflow.com/questions/1732348/...Ce script fait ce que vous cherchez, Mais résout également les liens vers des liens absolus.
Liens peuvent être à l'intérieur d'une variété d'attributs de sorte que vous pouvez passer une liste de ces attributs pour sélectionner
par exemple, avec la src et de l'attribut href (j'utilise ici la ^ opérateur de spécifier que l'une de ces valeurs d'attributs commence par http. Vous pouvez personnaliser ce comme requis
Attribut = valeur sélecteurs
Voici un exemple d'utilisation de @ars accepté de répondre et de la
BeautifulSoup4
,requests
, etwget
modules pour gérer les téléchargements.J'ai trouvé la réponse par @Blairg23 de travail , après la correction suivante (couvrant le scénario où il ne fonctionne pas correctement):
Pour Python 3:
urllib.parse.urljoin
doit être utilisé pour obtenir l'intégralité de l'URL à la place.BeatifulSoup propre analyseur peut être lent. Il serait peut-être plus réalisable à utiliser lxml qui est capable d'analyser directement à partir d'une URL (avec certaines limitations mentionnées ci-dessous).
Le code ci-dessus sera de retour les liens que est, et dans la plupart des cas, ils seraient liens relatifs ou absolus à partir de la racine du site. Depuis mon cas d'utilisation était de n'extraire qu'un certain type de liens, ci-dessous est une version qui convertit les liens Url et qui accepte éventuellement un glob motif comme
*.mp3
. Il ne gère pas les simples et le double de points dans les chemins relatifs, mais jusqu'à présent, je n'ai pas besoin d'elle. Si vous avez besoin pour analyser les URL des fragments contenant des../
ou./
puis urlparse.urljoin pourrait venir dans maniable.NOTE: Direct lxml analyser les url ne gère pas le chargement de
https
et ne pas faire des redirections, donc, pour cette raison, la version ci-dessous est à l'aide deurllib2
+lxml
.L'utilisation est la suivante:
lxml
ne peut gérer que d'entrée valide, comment peut-il remplacerBeautifulSoup
?lxml.html
est un peu plus clémente que lalxml.etree
. Si votre entrée n'est pas bien formé, alors vous pouvez définir explicitement le BeautifulSoup analyseur: lxml.de/elementsoup.html. Et si vous partez avec BeatifulSoup puis BS3 est un meilleur choix.