【问题标题】:rvest missing nodes --> NArvest 缺失节点 --> NA
【发布时间】:2015-04-26 12:11:41
【问题描述】:

我正在尝试使用 R 中的 rvest 在 html 文档中搜索节点。在下面的代码中,我想知道当“s_BadgeTop*”缺失时如何返回 NULL 或 NA。仅用于学术目的。

<div style="margin-bottom:0.5em;"><div><div style="float:left;">Por&nbsp;</div><div style="float:left;"><a href="/gp/pdp/profile/XXX" ><span style = "font-weight: bold;">JOHN</span></a> (UK)  - <a href="/gp/cdp/member-reviews/XXX">Ver todas las opiniones</a><br /><span class="cmtySprite s_BadgeTop1000 " ><span>(TOP 1000 COMENTARISTAS)</span></span></div></div></div>

<div style="margin-bottom:0.5em;"><div><div style="float:left;">Por&nbsp;</div><div style="float:left;"><a href="/gp/pdp/profile/YYY" ><span style = "font-weight: bold;">MARY</span></a> (USA)  - <a href="/gp/cdp/member-reviews/YYY">Ver todas las opiniones</a><br /></div></div></div>

<div style="margin-bottom:0.5em;"><div><div style="float:left;">Por&nbsp;</div><div style="float:left;"><a href="/gp/pdp/profile/ZZZ" ><span style = "font-weight: bold;">CANDICE</span></a> (UK)  - <a href="/gp/cdp/member-reviews/ZZZ">Ver todas las opiniones</a><br /><span class="cmtySprite s_BadgeTop500 " ><span>(TOP 500 COMENTARISTAS)</span></span></div></div></div>

我需要一个具有这种结构的data.frame:

  1. 约翰(前 1000 名评论家)
  2. 玛丽娜
  3. CANDICE(评论家 500 强)

我试过这段代码:

name <- pg %>%
html_nodes(xpath='//a[contains(@href,"/gp/pdp/profile/")]') %>%
html_text

status <- pg %>%
html_nodes(xpath='//span[contains(@class,"cmtySprite s_BadgeTop")]')  %>% 
html_text
status[is.na(status)] <- "NA"

但是 status[is.na(status)]

我得到这个输出:

  1. 约翰(前 1000 名评论家)
  2. MARY(评论家 500 强)
  3. CANDICE(评论家前 1000 名)

谢谢!

【问题讨论】:

  • 很难重现您的问题。没有cmtySprite s_BadgeTop 类的状态会发生什么情况?你试过tryCatch函数吗?
  • 如果没有“cmtySprite s_BadgeTop”,则将CANDICE的值赋给MARY。在其他情况下,我使用“cssApplyInNodeSet”解决了但不知道如何结合 rvest 和 css。
  • 您的问题中的CANDICEMARY 在哪里:|?除非您提供详细信息和可重复的示例,否则恐怕没有人可以帮助您;/
  • 在 HMTL 代码中,我包含了审稿人的姓名。一方面,我显示名称(即 JOHN、MARY、CANDICE),另一方面显示状态(前 1000 名评论员或前 500 名评论员)。我已经在上面澄清了我的问题。

标签: r parsing rvest


【解决方案1】:

您可以遍历三个条目中的每一个,从中提取名称和(可能是徽章),并最终合并所有结果。

例子:

# For rbindlist
library(data.table)

# Function to parse a particular 'div' and extract name and (potentially) badge
parse_node <- function(node) {
  name <- node %>% 
    html_node('a[href^="/gp/pdp/profile"]') %>%
    html_text
  badge <- node %>%
    html_nodes('span[class*="s_BadgeTop"] span') %>%
    html_text
  list(name=name[1],badge=badge[1])
}

# extract nodes, parse and merge
pg %>%  
  html_nodes('div[style^="margin-bottom"] div div[style^=float]:nth-child(2)') %>%
  lapply(parse_node) %>%
  rbindlist

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多