rvest: Фильтровать узел по внутреннему тексту класса и количеству элементов svg внутри - PullRequest
2 голосов
/ 09 марта 2020

My HTML выглядит следующим образом:

<div class="rates">
    <div class="rate">
        <span class="title">A</span>
        <img src="x.svg" alt="" width="20"><img src="x.svg" alt="" width="20"><img src="x.svg" alt="" width="20"> 
    </div>
    <div class="rate">
        <span class="title">B</span>
        <img src="y.svg" alt="" width="20"><img src="y.svg" alt="" width="20"> 
    </div>
</div>

Я хотел бы получить значения x.svg в A и значения y.svg в B. Итак:

A: 3
B: 2

У меня 2 проблемы:
1. Если я использую html_nodes(".rate"), я получаю оба, но не знаю, как фильтровать на основе текста заголовка.
2. Количество вхождений .svg элементов.

1 Ответ

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

Здесь возможное решение путем нахождения всех родительских узлов скорости и затем подсчета количества узлов img на одного родителя.

library(rvest)
library(magrittr)

page<-read_html('<div class="rates">
    <div class="rate">
        <span class="title">A</span>
        <img src="x.svg" alt="" width="20"><img src="x.svg" alt="" width="20"><img src="x.svg" alt="" width="20"> 
    </div>
    <div class="rate">
        <span class="title">B</span>
        <img src="y.svg" alt="" width="20"><img src="y.svg" alt="" width="20"> 
    </div>
</div>')

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

#find a single title node per parent
  titles <- ratenodes %>% html_node("span.title") %>% html_text()
#Count the number of img nodes per parent.
  imagecount <- sapply(ratenodes, function(node) { 
         node %>% html_nodes("img") %>% length()})

answer<-data.frame(titles, imagecount)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...