2017-10-04 3 views
1

J'essaie d'utiliser Beautiful Soup pour gratter des citations de films de rottentomatoes.com. La source de la page est intéressante en ce que les citations sont directement exécutées par une classe d'étendue "bold quote_actor", mais la citation elle-même est dans une plage sans classe, par ex. (https://www.rottentomatoes.com/m/happy_gilmore/quotes/): screenshot of web sourceBelle soupe - sélection du texte de l'élément span suivante sans classe

Je voudrais utiliser find_all de Beautiful Soup pour capturer toutes les citations, sans le nom de l'acteur. Je l'ai essayé beaucoup de choses sans succès, tels que:

moviequotes = soup(input) 
 
for t in web_soup.findAll('span', {'class':'bold quote_actor'}): 
 
    for item in t.parent.next_siblings: 
 
     if isinstance(item, Tag): 
 
      if 'class' in item.attrs and 'name' in item.attrs['class']: 
 
       break 
 
      print (item)

J'apprécierais beaucoup des conseils sur la façon de naviguer dans ce code et de définir le texte brut résultant cite dans un objet que j'utilise utiliser avec Pandas, etc

Répondre

0

J'utilise des sélecteurs CSS pour trouver le spans qui contiennent des guillemets: div span + span. Il trouve tout élément span qui est dans un div et qui a un élément direct apparenté à span.

De cette façon, je reçois également les span qui contiennent des noms d'acteurs, donc je les filtre en vérifiant s'ils ont un attribut class ou style.

import bs4 
import requests 

url = 'https://www.rottentomatoes.com/m/happy_gilmore/quotes/' 
page = requests.get(url).text 
soup = bs4.BeautifulSoup(page, 'lxml') 

# CSS selector 
selector = 'div span + span' 

# find all the span elements which are a descendant of a div element 
# and are a direct sibling of another span element 
quotes = soup.select(selector) 

# now filter out the elements with actor names 
data = [] 

for q in quotes: 
    # only keep elements that don't have a class or style attribute 
    if not (q.has_attr('class') or q.has_attr('style')): 
     data.append(q) 

for d in data: 
    print(d.text) 
+0

Parfait! Merci beaucoup. J'ai beaucoup appris en examinant attentivement votre réponse. – user8422605