2017-10-06 15 views
1

C'est ma première tentative pour traiter les sélecteurs HTML et CSS. J'utilise le package R rvest pour mettre au rebut le site Billboard Top 100. Certaines des données qui m'intéressent comprennent le classement de cette semaine, la chanson, la météo ou non, la chanson est New, et la météo ou pas la chanson a des prix.Lecture en html avec R rvest. Comment vérifier si une classe de sélecteur CSS contient quelque chose?

Je suis en mesure d'obtenir le nom de la chanson et le rang qui suit:

library(rvest) 
URL <- "http://www.billboard.com/charts/hot-100/2017-09-30" 

webpage <- read_html(URL) 
current_week_rank <- html_nodes(webpage, '.chart-row__current-week') 
current_week_rank <- as.numeric(html_text(current_week_rank)) 

Mon problème est livré avec les nouveaux indicateurs et prix. Les chansons sont répertoriés dans les lignes avec chacun des 100 contenus dans:

<article> class="chart-row char-row--1 js chart-row" .... 
</article> 

Si une chanson est nouvelle, ce sera la classe en son sein comme:

<div class="chart-row__new-indicator"> 

Si une chanson a un prix, il sera cette classe en son sein:

<div class="chart-row__award-indicator"> 

est-il possible que je peux regarder les 100 instances de la classe = « tableau-ligne char-ligne - 1 js tableau rangée » ... et voir si l'un d'entre eux existe en son sein? La sortie que je reçois de current_week_rank est une colonne de 100 valeurs. J'espère qu'il y a un moyen d'obtenir ceci pour avoir une observation pour chaque chanson.

Nous vous remercions de votre aide ou de vos conseils.

+0

veuillez partager un exemple d'URL, ce n'est pas tout à fait clair La structure de la page. – MichaelChirico

+0

@MichaelChirico L'URL est http://www.billboard.com/charts/hot-100/2017-09-30 – Jorge

+0

Vous pouvez essayer '...%>% html_attr ('class')', qui vous renverra un vecteur de caractère de la classe de l'étiquette. Ensuite, vérifiez si un nom de classe css spécifique est dans la chaîne. – kitman0804

Répondre

1

Correspond essentiellement à une version personnalisée du Q & A I indiqué ci-dessus. Je ne peux pas dire à 100% certain si le or fonctionne comme prévu, car il n'y a qu'une seule ligne dans votre page d'exemple avec un <div class="chart-row__new-indicator">, et cette ligne a aussi une étiquette <div class="chart-row__award-indicator">.

#xpath to focus on the 100 rows of interest 
primary_xp = '//div[@class="chart-row__primary"]' 
#xpath which subselects rows you're after 
check_xp = paste('div[@class="chart-row__award-indicator" or' , 
        '@class="chart-row__new-indicator"]') 

webpage %>% html_nodes(xpath = primary_xp) %>% 
    #row__primary for which there are no such child nodes 
    # will come back NA, and hence so will html_attr('class') 
    html_node(xpath = check_xp) %>% 
    #! is a bit extraneous, as it only flips FALSE to TRUE 
    # for the rows you're after (necessity depends on 
    # particulars of your application) 
    html_attr('class') %>% is.na %>% `!` 

FWIW, vous peut être en mesure de réduire check_xp à ce qui suit:

check_xp = 'div[contains(@class, "indicator")]' 

qui couvre certainement les deux "chart-row__award-indicator" et "chart-row__new-indicator", mais enveloppait aussi des autres noeuds avec un class contenant "indicator", si un tel tag existe (vous devrez le déterminer vous-même)