rvest: обработка разного количества вложенных классов - PullRequest
1 голос
/ 21 марта 2020

Я не уверен, как описать проблему, поэтому я * go непосредственно приведу пример.
У меня есть HTML документ (html_doc), который выглядит следующим образом:

<div class="main">
   <h2>A</h2>
   <div class="route">
      X<br />
   </div>
   <div class="route">
      Y<br />
   </div>
</div>
<div class="main">
   <h2>B</h2>
   <div class="route">
      Z<br />
   </div>
</div>

Внутри каждого main, кроме title и route, есть еще элементы, поэтому я ищу масштабируемое решение. Классы в main всегда одинаковы.
Я хотел бы получить тиббл, похожий на:

id | title | route
1  | A     | X
1  | A     | Y
2  | B     | Z 

Моя текущая попытка выдает ошибку, потому что в title есть другое количество строк и route. Я также не знаю, как индексировать класс main.

tibble(
  title = html_doc %>% html_nodes("h2") %>% html_text(), 
  route = html_doc %>% html_nodes(".route") %>% html_text()
  ) 

1 Ответ

1 голос
/ 21 марта 2020

Это следует той же стратегии, что и ваш предыдущий вопрос. Хитрость заключается в том, чтобы l oop через каждый дочерний узел создать отдельный data.frame заголовка и маршрута, а затем объединить все отдельные кадры данных в окончательный результат.
Это решение зависит от наличия только одного заголовка на узел.

library(rvest)
library(dplyr)

page<-read_html('<<div class="main">
   <h2>A</h2>
   <div class="route">
      X<br />
   </div>
   <div class="route">
      Y<br />
   </div>
</div>
<div class="main">
   <h2>B</h2>
   <div class="route">
      Z<br />
   </div>
</div>')

#find all of the parent nodes
mainnodes <- page %>% html_nodes("div.main")

#loop through each parent node and extract the info from the children
dfs<-lapply(1:length(mainnodes), function(id){
  #assume a single title node or same number as routes
  title <- mainnodes[id] %>% html_nodes("h2") %>% html_text() %>% trimws()
  #Count the number of img nodes per parent.
  route <- mainnodes[id] %>% html_nodes("div.route") %>% html_text() %>% trimws()

  tibble(id, title, route)
})

answer<-bind_rows(dfs)
answer

# A tibble: 3 x 3
     id title route
  <int> <chr> <chr>
1     1 A     X    
2     1 A     Y    
3     2 B     Z 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...