Rvest 忽略某些嵌套元素
Rvest ignore certain nested elements
我正在努力学习如何在 yelp 上刮擦和练习。我 运行 在其中一个有额外嵌套 div 的页面上遇到问题:
https://www.yelp.com/biz/funny-bbq-new-york-2?start=40
我需要忽略之前的评论。我想以某种方式忽略它。这是我编写的代码,用于抓取我需要的所有其他内容。我还想确保它在任何超过一个的页面上都被忽略,尽管我没有看到任何页面。 之前的评论 的问题是前三个对象 dates
、review_text
和 stars
的长度为 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)
我正在努力学习如何在 yelp 上刮擦和练习。我 运行 在其中一个有额外嵌套 div 的页面上遇到问题:
https://www.yelp.com/biz/funny-bbq-new-york-2?start=40
我需要忽略之前的评论。我想以某种方式忽略它。这是我编写的代码,用于抓取我需要的所有其他内容。我还想确保它在任何超过一个的页面上都被忽略,尽管我没有看到任何页面。 之前的评论 的问题是前三个对象 dates
、review_text
和 stars
的长度为 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)