【问题标题】:web scraping from the same level multiple nodes with the same names从同级多个同名节点抓取网页
【发布时间】:2021-05-21 22:01:29
【问题描述】:

我想从四个节点中提取以下数据,所有节点都在同一级别,并且共享相同的代号。

# I was able to extract the first of the four nodes - Property Amenities, using google chrome selector gadget as to identify the nodes.  

library(rvest)
page0_url<-read_html ("https://www.tripadvisor.com/Hotel_Review-g1063979-d1447619-Reviews- 
Solana_del_Ter-Ripoll_Province_of_Girona_Catalonia.html")
result_amenities <- html_text (html_node(page0_url,"._1nAmDotd") %>% html_nodes("div") )

但是,我不知道如何传递代码以提取名为“房间特征”的第二个对象中的元素。这是在同一节点级别,并且与上面的具有相同的名称代码=。这也是最后一个之后的两个对象的情况,名称为“房间类型”和“很高兴知道”。

【问题讨论】:

  • 以下这些答案都没有解决您的问题吗?

标签: r web-scraping rvest


【解决方案1】:

您需要使用html_nodes() 函数查询所有具有相同类的节点,然后单独解析每个节点。

举例

library(rvest)

url<- "https://www.tripadvisor.com/Hotel_Review-g1063979-d1447619-Reviews-Solana_del_Ter-Ripoll_Province_of_Girona_Catalonia.html"

page0_url<-read_html(url)
result_amenities <- html_text(html_nodes(page0_url,"._1nAmDotd") %>% html_nodes("div") )

names <- html_nodes(page0_url,"div._1mJdgpMJ") %>% html_text()
groupNodes <- html_nodes(page0_url,"._1nAmDotd")
outputlist <-lapply(groupNodes, function(node){
   results <- node %>% html_nodes("div") %>% html_text()
})

在参考页面上没有相应的“_1nAmDotd”节点的“Good to Know”部分,因此导致结果不平衡。

【讨论】:

    【解决方案2】:

    几乎所有需要的数据(包括您请求的所有数据)都可以通过页面清单在脚本标签中获得,因为它是从那里加载的。您可以使用正则表达式正则表达式输出大量数据。然后编写用户定义的函数来提取所需的信息。

    我最初将正则表达式匹配组解析为 json 对象all_data。然后,我查看该列表列表以查找仅与感兴趣的数据相关联的字符串。例如,starRating 与您感兴趣的位置数据相关联。get_target_list 返回该列表,然后我从中提取我想要的内容。你可以看到 location_info 拥有与酒店设施(包括房间设施)、星级(酒店等级)和所用语言等相关的数据。

    例如location_info$hotelAmenities$languagesSpokenlocation_info$hotelAmenities$highlightedAmenities$roomFeatures ........

    注意正如目前所写的那样,search_string 对于所需列表是唯一的,在最初保存在 json 对象中的列表列表中。我不确定命名列表的名称是否会保持不变,因此选择动态检索正确的列表。


    R:

    library(rvest)
    library(jsonlite)
    library(stringr)
    library(magrittr)
    
    is_target_list <- function(x, search_string) {
      return(str_detect(x %>% toString(), search_string))
    }
    
    get_target_list <- function(data_list, search_string) {
      mask <- lapply(data_list, is_target_list, search_string) %>% unlist()
      return(subset(data_list, mask))
    }
        
    r <- read_html("https://www.tripadvisor.com/Hotel_Review-g1063979-d1447619-Reviews-Solana_del_Ter-Ripoll_Province_of_Girona_Catalonia.html") %>%
      toString()
    
    all_data <- gsub("pageManifest:", '"pageManifest":', stringr::str_match(r, "(\\{pageManifest:.*);\\(")[, 2]) %>%
      jsonlite::parse_json()
    
    data_list <- all_data$pageManifest$urqlCache
    # target_info <- get_target_list(data_list, 'hotelAmenities')
    
    location_info <- get_target_list(data_list, "starRating") %>%
      unname() %>%
      .[[1]] %>%
      {
        .$data$locations[[1]]$detail
      }
    

    正则表达式:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      相关资源
      最近更新 更多