2017-01-17 2 views
0

мне нужно разобрать следующий HTML-документ:Анализировать HTML в R с частичными совпадениями

<span class="revision-gradient shadowed">90</span> 
<span class="revision-gradient not_shadowed">75</span> 
<span class="revision-gradient shadowed">85</span> 
<span class="revision-gradient blurred">60</span> 

Чтобы вернуть список:

[90, 75, 85, 60] 

Я обычно использую этот код, но я не знаете, как разобрать для частичного совпадения:

document <- htmlParse(url) 
myList <- unlist(lapply(document['//span[@class="revision-gradient"]'],xmlValue)) 
+0

Являются ли они единственными элементами в документе XML или есть дополнительные теги, которые необходимо игнорировать? –

+0

Существует 5 или 6 вариантов. Не тонна, так что худший сценарий, построивший список разных комбинаций, будет работать. – NBC

+0

- это интересующие вас варианты, или они меняются? –

ответ

1
library(rvest) 

pg <- read_html(' 
<span class="revision-gradient shadowed">90</span> 
<span class="revision-gradient not_shadowed">75</span> 
<span class="revision-gradient shadowed">85</span> 
<span class="revision-gradient blurred">60</span> 
') 

html_nodes(pg, "span.revision-gradient") %>% 
    html_text() 
## [1] "90" "75" "85" "60" 

или

html_nodes(pg, xpath=".//descendant-or-self::span[@class and 
      contains(concat(' ', normalize-space(@class), ' '), 
      ' revision-gradient ')]") %>% 
    html_text() 

Если вы застряли в XML -л .:

library(XML) 

doc <- htmlParse(' 
<span class="revision-gradient shadowed">90</span> 
<span class="revision-gradient not_shadowed">75</span> 
<span class="revision-gradient shadowed">85</span> 
<span class="revision-gradient blurred">60</span> 
') 

xpathSApply(doc, "//descendant-or-self::span[@class and 
      contains(concat(' ', normalize-space(@class), ' '), 
      ' revision-gradient ')]", xmlValue) 

Если вы хотите, чтобы числовые значения просто вызывали as.numeric() на вектор.

1

Вы можете использовать XML::xpathSApply

myList <- xpathSApply(document, "//span", xmlValue) 

И если у вас есть больше пролетные пути, следующие будут более надежными

myList <- unlist(xpathSApply(document, "//span", function(x) { 
    if (grepl("revision-gradient", xmlGetAttr(x, "class"))) { 
     return(xmlValue(x)) 
    } 
    NULL 
})) 

НТН

Смежные вопросы