这是一个很好的例子。
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-->
与此产品不同,其他产品只有一个产品名称选项。因此行数没有问题。 我过去常常提取选项数据。
- 提取选项
醇>
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 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
我尽我所能。我迫切需要你的帮助。 这些有什么创意吗?
答案 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
中组合)
希望这有帮助