2017-10-06 17 views
1

これは、HTMLセレクタとCSSセレクタを扱う私の最初の試みです。私はBillboard Top 100のウェブサイトをスクラップするためにRパッケージrvestを使用しています。私が興味を持っているデータには、今週のランク、歌、天気などが含まれています。曲はNewで、天気かどうかは賞がありません。R rvestでhtmlで読む。 CSSセレクタークラスに何が含まれているかどうかを確認するにはどうすればよいですか?

私は次のように曲の名前とランクを取得することができています:

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)) 

私の問題は、新しい賞のインジケータが付いています。曲はに含まれている100のそれぞれを持つ行に記載されています:曲が、賞を持っている場合

​​

:曲が新しい場合

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

、これは次のようにその中のクラスを持っていますその中で、このクラスになります:「チャート行の文字列 - 1つのJSチャート行を」

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

は、私はクラス=のすべての100個のインスタンスを見ることができる方法はある...と見ますこれらのいずれかがその中に存在する場合、 current_week_rankから得られる出力は、100個の値の1つの列です。私は、これを取得して各曲に1つの観測を持たせる方法があることを期待しています。

ご協力いただきありがとうございます。

+0

例のURLを共有してください。完全にはっきりしません。 eページの構造。 – MichaelChirico

+0

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

+0

です。あなたは '...%>%html_attr( 'class')'を試すことができます。タグのクラスの文字ベクトル。次に、特定のcssクラス名が文字列内にあるかどうかを確認します。 – kitman0804

答えて

1

基本的に上記のQ &Aの調整バージョンになります。 orが意図したとおりに動作しているかどうかを100%確かめることはできません。例のページには<div class="chart-row__new-indicator">という行が1つしかないので、その行にも<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、あなた次へcheck_xpを短縮することができる場合があります

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

確か"chart-row__award-indicator""chart-row__new-indicator"の両方をカバーするだけでなく、"indicator"を含むclassで他のノードを包むだろう、そのような代替タグが存在する場合(自分でこれを判断する必要があります)

関連する問題