Rvest 忽略某些嵌套元素

Rvest ignore certain nested elements

我正在努力学习如何在 yelp 上刮擦和练习。我 运行 在其中一个有额外嵌套 div 的页面上遇到问题:

https://www.yelp.com/biz/funny-bbq-new-york-2?start=40

我需要忽略之前的评论。我想以某种方式忽略它。这是我编写的代码,用于抓取我需要的所有其他内容。我还想确保它在任何超过一个的页面上都被忽略,尽管我没有看到任何页面。 之前的评论 的问题是前三个对象 datesreview_textstars 的长度为 11,但最后三个仅以10

review_top <- "https://www.yelp.com/biz/funny-bbq-new-york-2?start=40" %>%
        read_html() %>%
        html_elements("ul.undefined:nth-child(4)")

    reviews <- tibble(
        dates = review_top %>% html_elements(".margin-t1__09f24__w96jn") %>%
            html_text(),
        review_text = review_top %>% html_elements(".raw__09f24__T4Ezm") %>%
            html_text(),
        stars = review_top %>% html_elements(".i-stars__09f24__M1AR7") %>%
            html_attr("aria-label"),
        useful = review_top %>%
            html_elements(xpath = "(//span[@class=' css-12i50in'])[position() mod 3 = 1]") %>%
            html_text2(),
        funny = review_top %>%
            html_elements(xpath = "(//span[@class=' css-12i50in'])[position() mod 3 = 2]") %>%
            html_text2(),
        cool = review_top %>%
            html_elements(xpath = "(//span[@class=' css-12i50in'])[position() mod 3 = 0]") %>%
            html_text2()
    )

一种更简单的方法是提取页面上的 10 条评论,然后从每条评论中提取想要的信息。 每条评论都被标识为 作为 <div class = "review__09f24__oHr9V"> 下的节点 <li class=margin-b5__09f24__pTvws div.review__09f24__oHr9V>节点。

使用 html_element() 函数 no "s" 将始终提供 1 和一个 1 结果,即使该结果为 NA。通过这种方式,我们从 10 个节点中提取信息,因此将 return 这 10 个节点中每个节点的第一条信息。任何重复项都将被忽略,缺失值将 return 编辑为 NA。

library(rvest)

page <- "https://www.yelp.com/biz/funny-bbq-new-york-2?start=40" %>%  read_html()

#Find all of the top level reviews
reviews <- page %>%  html_elements("li.margin-b5__09f24__pTvws div.review__09f24__oHr9V")

#extract the desired information from each review
dates <- reviews %>% html_element(".margin-t1__09f24__w96jn") %>% html_text()
review_text = reviews %>% html_element(".raw__09f24__T4Ezm") %>% html_text()
stars <- reviews %>% html_element("div.i-stars__09f24__M1AR7")%>% html_attr("aria-label")
useful = reviews %>%  html_element(xpath = "(//span[@class=' css-12i50in'])[position() mod 3 = 1]") %>%
   html_text2()

funny = reviews %>% html_elements(xpath = "(//span[@class=' css-12i50in'])[position() mod 3 = 2]") %>%
   html_text2()

cool = reviews %>% html_elements(xpath = "(//span[@class=' css-12i50in'])[position() mod 3 = 0]") %>%
   html_text2()

answer <- tibble(
   dates, review_text, stars,  useful,  funny, cool)