使用rvest选择无class或id属性div元素及组合调用异常解决
rvest 选中无class/id属性div节点的正确实现
链式调用返回空集的原因
你之前的链式写法返回空集,本质是对rvest中html_nodes()的匹配逻辑理解有误:当向html_nodes()传入已经提取完成的节点集时,函数会在这些节点的所有后代子节点中匹配选择器,而非对当前节点集本身的每个节点做条件过滤。
你第一步通过page %>% html_nodes("div:not([class])")得到的结果是:带id的tag div、两个无任何属性的div。这些div节点内部没有嵌套的div子节点,后续再调用html_nodes("div:not([id])")自然找不到匹配内容,返回空集。
可行的实现方案
- 最简洁的写法是将两个过滤条件直接合并到单条CSS选择器中,在初始查询时完成双重判断,不需要分两次调用:
这条选择器会直接选中同时满足「无class属性」、「无id属性」的div节点,正好排除前两个带属性的div。page %>% html_nodes("div:not([class]):not([id])") - 如果需要在已经提取完成的全量div节点集中做二次筛选,可以基于rvest的属性提取规则直接做向量过滤,不需要重复调用节点查找函数:
该方法的判断逻辑是:rvest中如果节点不存在对应属性,# 先提取所有div节点 all_divs <- page %>% html_nodes("div") # 筛选既无class也无id属性的节点 target_divs <- all_divs[ is.na(html_attr(all_divs, "class")) & is.na(html_attr(all_divs, "id")) ]html_attr()会返回NA,利用这个特征做向量化匹配,不需要依赖额外第三方包。
内容的提问来源于stack exchange,提问作者broti
相关产品推荐
相关产品推荐

