在R

时间:2017-03-17 06:37:51

标签: html r

这是一个很好的例子。

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

这是一个有两个选项的产品。 一个是' Gloss Finish'类型,另一个是'Satin Finish'类型。

我可以用这两种类型选择颜色。

  
      
  • 光泽面漆 - 鸽子灰/黑色/亚麻白/高山白/柑橘黄......
  •   
  • 缎面处理 - 鸭蛋蓝/粉红色/亚麻白
  •   

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>

选择选项后,有关于颜色的详细数据。

<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
                    <meta itemprop="priceCurrency" content="GBP" />
                    <meta itemprop="name" content="Anglepoise Original 1227 Giant Outdoor Floor Lamp: Dove Grey" />
                    <meta itemprop="price" content="3,125.00" />
                </div><!--meta-->

与此产品不同,其他产品只有一个产品名称选项。因此行数没有问题。 我过去常常提取选项数据。

  
      
  1. 提取选项
  2.   
html_nodes(xpath='//*[@id="product-option-selector"]/option')%>%
    html_text()   
  
      
  1. 提取名称
  2.   
html_nodes(".product-options")%>%
    html_nodes("[itemprop=name]")%>%
    html_attr("content")

但是有了这些,行数有差异,所以结果如下。

  [Options]        [Colors]

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

但我想要这样的结果,

  [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

我尽我所能。我迫切需要你的帮助。 这些有什么创意吗?

1 个答案:

答案 0 :(得分:1)

我们可以这样做:

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

它基本上构建了两个表,就像你一样,然后将它们合并到ID上。

请注意,我选择了一些略有不同的来源,尤其是颜色名称。从li中取出它们比较简单,因为不需要字符串卫生。

如何通过map_df构建这两个表是非常复杂的解释,但如果需要,你可以扩展我给你的东西。 (提示:它基本上为每个节点执行~{ }内的函数,然后在data.frame中组合)

希望这有帮助