2017-10-06 25 views
1

이것은 HTML 및 CSS 선택기를 다루는 첫 번째 시도입니다. Billboard Top 100 웹 사이트를 스크랩하기 위해 R 패키지를 사용하고 있습니다. 내가 관심있는 데이터 중 일부는 이번 주 순위, 노래, 날씨 또는 노래가 New인지, 날씨가 아닌지 또는 노래에 상장이 있는지 등을 포함합니다.R을 사용하여 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)) 

내 문제는 새로운 수상 지표와 함께 제공됩니다. 노래가 새로운

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

경우, 이것은 그 안에 클래스가 좋아하는 것 :

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

을 노래 상을 가지고 있다면,이 노래는에 포함 된 (100)의 각각의 행에 나열되어 있습니다 그 안에이 클래스 될 것 "차트 행 문자 행 - 1 JS 차트 행을"

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

내가 클래스 = 모든 100 개 인스턴스 볼 수있는 방법이 있나요 ... 그리고 참조 이 중 하나가 그 안에 있다면? current_week_rank에서 얻은 출력은 100 개의 값 중 하나의 열입니다. 나는 이것을 얻을 수있는 방법이있어서 각 노래에 대해 한 가지 관찰을하기를 바라고있다.

도움이나 조언을 보내 주셔서 감사합니다.

+0

예제 URL을 공유하십시오. 완전히 명확하지 않습니다. 페이지 구조. – 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">이있는 행이 하나뿐이기 때문에 그 행에도 <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을 단축 할 수 있습니다 : 확실히 커버 모두 "chart-row__award-indicator""chart-row__new-indicator"뿐만 아니라 class"indicator"를 포함하여 다른 노드를 마무리 할

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

, 그러한 대체 태그가있는 경우 (직접 결정해야 함)