web-dev-qa-db-fra.com

Comment utiliser les sélecteurs CSS pour récupérer des liens spécifiques se trouvant dans une classe à l'aide de BeautifulSoup?

Je suis nouveau sur Python et je l'apprends à des fins de scraping J'utilise BeautifulSoup pour collecter des liens (ie href de la balise 'a'). J'essaye de collecter les liens sous le "UPCOMING" Onglet EVENTS "du site http://allevents.in/lahore/ . J'utilise Firebug pour inspecter l'élément et obtenir le chemin CSS mais ce code ne me renvoie rien. Je cherche le correctif et aussi quelques suggestions sur la façon de choisir les sélecteurs CSS appropriés pour récupérer les liens souhaités à partir de n'importe quel site. J'ai écrit ce morceau de code:

from bs4 import BeautifulSoup

import requests

url = "http://allevents.in/lahore/"

r  = requests.get(url)

data = r.text

soup = BeautifulSoup(data)
for link in soup.select( 'html body div.non-overlay.gray-trans-back div.container div.row div.span8 div#eh-1748056798.events-horizontal div.eh-container.row ul.eh-slider li.h-item div.h-meta div.title a[href]'):
    print link.get('href')
14
Flecha

La page n'est pas la plus conviviale dans l'utilisation des classes et du balisage, mais même ainsi, votre sélecteur CSS est trop spécifique pour être utile ici.

Si vous voulez des événements à venir, vous voulez juste le premier <div class="events-horizontal">, puis saisissez simplement le <div class="title"><a href="..."></div> tags, donc les liens sur les titres:

upcoming_events_div = soup.select_one('div#events-horizontal')
for link in upcoming_events_div.select('div.title a[href]'):
    print link['href']

Notez que vous ne devez pas utiliser r.text; utilisation r.content et laisser le décodage à Unicode à BeautifulSoup. Voir Problème d'encodage d'un caractère dans utf-8

27
Martijn Pieters
soup.select('div')
All elements named <div>

soup.select('#author')
The element with an id attribute of author

soup.select('.notice')
All elements that use a CSS class attribute named notice

soup.select('div span')
All elements named <span> that are within an element named <div>

soup.select('div > span')
All elements named <span> that are directly within an element named <div>, with no other element in between

soup.select('input[name]')
All elements named <input> that have a name attribute with any value

soup.select('input[type="button"]')
All elements named <input> that have an attribute named type with value button

Vous pouvez également être intéressé par ce livre .

16
Lavish Saluja
import bs4 , requests

res = requests.get("http://allevents.in/lahore/")
soup = bs4.BeautifulSoup(res.text)
for link in soup.select('a[property="schema:url"]'):
    print link.get('href')

Ce code fonctionnera bien !!

11
Anuj Saraswat