1

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. キャンディス (トップ 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)] <- "NA" は機能しません。

私はこの出力を得る:

  1. ジョン (トップ 1000 コメンタリスト)
  2. メアリー (トップ 500 コメンタリスト)
  3. キャンディス (トップ 1000 コメンタリスト)

ありがとう!

4

1 に答える 1

1

3 つのエントリのそれぞれを反復処理し、そこから名前と (場合によってはバッジ) を抽出し、最終的にすべての結果をマージできます。

例:

# 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
于 2015-05-08T20:16:59.963 に答える