首页 > 解决方案 > rvest:根据内部类文本过滤节点并计算内部svg元素的数量

问题描述

我的 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.svgin和in的A计数。所以:y.svgB

A: 3
B: 2

我有 2 个问题:
1. 如果我同时使用html_nodes(".rate")两者,但不知道如何根据标题文本进行过滤。
2. 计算.svg元素出现的次数。

标签: rrvest

解决方案


这是通过查找所有父速率节点然后计算每个父节点的 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)

推荐阅读