2017-03-17 4 views
0

이 문제에 대한 좋은 예가 있습니다. 다른 옵션을 사용하여 HTML 데이터를 추출하십시오.

https://www.nest.co.uk/product/anglepoise-original-1227-giant-outdoor-floor-lamp

은 두 가지 옵션이있는 제품입니다. 하나는 '광택 마감'유형이고 다른 하나는 '새틴 마침'유형입니다.

두 가지 유형으로 색상을 선택할 수 있습니다.

  • 광택 마감 - 비둘기 그레이/제트 블랙/리넨 화이트/알파인 화이트/감귤류 노란색 ...
  • 새틴 마감 - 오리 계란 블루/꽃 핑크/리넨 화이트

HTML은 다음과 같습니다.

<select title="Select an option" name="product-option" 
id="product-option-selector" class="product-option-selector"> 
       <option value="198841">Gloss Finish</option> 
       <option value="198857">Satin Finish</option> 
      </select> 

옵션을 선택하면 색상에 대한 세부 정보가 있습니다.

이 제품과 다른 제품은 하나의 제품 이름에만 옵션이 있습니다. 따라서 행 수에는 문제가 없습니다. 아래와 같이 옵션 데이터를 추출하는 데 사용되었습니다.

  1. 추출 옵션
html_nodes(xpath='//*[@id="product-option-selector"]/option')%>% 
    html_text() 
  • 추출 이름
  • html_nodes(".product-options")%>% 
        html_nodes("[itemprop=name]")%>% 
        html_attr("content") 
    

      하지만 이것으로 행 수에 차이가 있으므로 결과는 아래와 같습니다.

      [Options]  [Colors] 
      
      1 Gloss Finish Dove Gray 
      2 Gloss Finish Jet Black 
      3 Gloss Finish Linen White 
      4 Gloss Finish Alpine White 
      5 Gloss Finish Citrus Yellow 
      6 Satin Finish Duck Egg Blue 
      7 Satin Finish Blossom Pink 
      

      [Options]  [Colors] 
      
      1 Gloss Finish Dove Gray 
      2 Satin Finish Jet Black 
      3 NA    Linen White 
      4 NA    Alpine White 
      5 NA    Citrus Yellow 
      

      하지만이 같은 결과를 원하는, 나는 내가 할 수있는 모든 것을 시도했다. 필사적으로 당신의 도움이 필요합니다. 이러한 아이디어가 있습니까?

    답변

    1

    우리는 할 수 있습니다 : 그것은 기본적으로 당신이 그랬던 것처럼, 두 개의 테이블을 구축 한 다음 ID에 병합

    library(rvest) 
    library(purrr) 
    
    url <- 'https://www.nest.co.uk/product/anglepoise-original-1227-giant-outdoor-floor-lamp' 
    
    
    page <- read_html(url) 
    
    prods <- page %>% 
        html_nodes('#product-option-selector') %>% 
        html_nodes('option') %>% 
        map_df(~{ 
         id = .x %>% html_attr('value') 
         name = .x %>% html_text() 
         data.frame(id, name) 
        }) 
    
    colors <- page %>% 
        html_nodes('.option-group') %>% 
        map_df(~{ 
         id = .x %>% html_attr('rel') 
         colors = .x %>% 
          html_nodes('li') %>% 
          html_text() 
         data.frame(id, colors = colors) 
        }) 
    
    final <- merge(prods, colors) 
    
    # final 
    #  id   name   colors 
    # 1 198841 Gloss Finish  Dove Grey 
    # 2 198841 Gloss Finish  Jet Black 
    # 3 198841 Gloss Finish  Linen White 
    # 4 198841 Gloss Finish Alpine White 
    # 5 198841 Gloss Finish Citrus Yellow 
    # 6 198841 Gloss Finish  Crimson Red 
    # 7 198841 Gloss Finish Fresh Orange 
    # 8 198841 Gloss Finish Vibrant Magenta 
    # 9 198841 Gloss Finish  Marine Blue 
    # 10 198857 Satin Finish Duck Egg Blue 
    # 11 198857 Satin Finish Blossom Pink 
    # 12 198857 Satin Finish  Linen White 
    # 13 198857 Satin Finish  Moon Grey 
    # 14 198857 Satin Finish  Slate Grey 
    # 15 198857 Satin Finish  Jet Black 
    

    .

    특히 색상 이름에 대해 약간 다른 소스를 선택했음을 유의하십시오. 문자를 li에서 가져 오는 것이 문자열 위생을 필요로하지 않으므로 간단합니다.

    map_df을 통해 두 테이블을 작성하는 방법은 설명하기가 복잡하지만 필요한 경우 내가 준 것에 대해 확장 할 수 있습니다.(힌트 : 그것은 기본적으로 각 노드에 대한 ~{ } 내부의 기능을 수행 한 다음 data.frame에 결합)

    희망이 늦게 코멘트

    +0

    죄송 데 도움이! 내가 당신의 코드를 확인한 후에 당신이 완전히 천재라는 것을 깨달았습니다! 나는 그렇게 생각하지 않아. –

    관련 문제