我怎么能刮掉这个食谱?

时间:2018-03-20 09:11:55

标签: r web-scraping rvest

我正在试图为我自己的个人收藏网上找到一些食谱。它在某些网站上效果很好,因为网站结构有时很容易抓取,但有些更难。这个我不知道如何处理:

https://www.koket.se/halloumigryta-med-tomat-linser-och-chili

目前,让我们假设我想要左边的食材。如果我检查网站,看起来我想要的是两个article class="ingredients"块。但我似乎无法到达那里。

enter image description here

我从以下开始:

library(rvest)
library(tidyverse)
read_html("https://www.koket.se/halloumigryta-med-tomat-linser-och-chili") %>%
  html_nodes(".recipe-column-wrapper") %>% 
  html_nodes(xpath = '//*[@id="react-recipe-page"]')

但是,运行上面的代码表明所有成分都存储在data-item中,如下所示:

<div id="react-recipe-page" data-item="{
   "chefNames":"<a href='/kockar/siri-barje'>Siri Barje</a>",
   "groupedIngredients":[{
      "header":"Kokosris",
      "ingredients":[{
         "name":"basmatiris","unit":"dl","amount":"3","amount_info":{"from":3},"main":false,"ingredient":true
      }
      <<<and so on>>>

所以我有点困惑,因为通过检查网站,一切似乎都整齐地放在我能提取的东西上,但现在却没有。相反,我需要一些严肃的正则表达式来获得我想要的一切。

所以我的问题是:我错过了什么吗?有什么方法可以获得ingredients文章的内容吗?

(我尝试了SelectorGadget,但它只给了我No valid path found)。

1 个答案:

答案 0 :(得分:2)

您可以使用html_attr("data-item")包中的rvest提取属性。

此外,数据项属性在JSON中看起来很像,您可以使用fromJSON包中的jsonlite转换为列表:

html <- read_html("https://www.koket.se/halloumigryta-med-tomat-linser-och-chili") %>%
  html_nodes(".recipe-column-wrapper") %>% 
  html_nodes(xpath = '//*[@id="react-recipe-page"]')

recipe <- html %>% html_attr("data-item") %>% 
  fromJSON

最后,recipe列表包含许多不相关的值,但成分和度量也在元素recipe$ingredients中。