2017-08-02 2 views
0

Je suis nouveau à rvest. Comment puis-je extraire ces éléments avec 2 noms de classes ou seulement 1 nom de classe dans tag?rvest - gratter 2 classes dans 1 tag

Ceci est mon code et numéro:

doc <- paste("<html>", 
      "<body>", 
      "<span class='a1 b1'> text1 </span>", 
      "<span class='b1'> text2 </span>", 
      "</body>", 
      "</html>" 
      ) 
library(rvest) 
read_html(doc) %>% html_nodes(".b1") %>% html_text() 
#output: text1, text2 
#what i want: text2 

#I also want to extract only elements with 2 class names 
read_html(doc) %>% html_nodes(".a1 .b1") %>% html_text() 
# Output that i want: text1 

Ceci est ma spec machine:

Système d'exploitation: Windows 10.

version rvest: 0.3.2

R version 3.3.3 (2017-03-06) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows >= 8 x64 (build 9200) 

Quelqu'un peut-il aider?

Répondre

1

Vous pouvez utiliser le sélecteur CSS comme suit:

classe Select contient b1 non a1:

read_html(doc) %>% html_nodes(".b1:not(.a1)") 
# {xml_nodeset (1)} 
# [1] <span class="b1"> text2 </span> 

Ou utilisez le sélecteur d'attribut:

read_html(doc) %>% html_nodes("[class='b1']") 
# {xml_nodeset (1)} 
# [1] <span class="b1"> text2 </span> 

classe Select contient à la fois:

read_html(doc) %>% html_nodes(".a1.b1") 
# {xml_nodeset (1)} 
# [1] <span class="a1 b1"> text1 </span> 
+0

Merci! Pour votre première solution, qu'est-ce que ': not()'? est-ce 1 syntaxe ou le ':' peut être utilisé en conjonction avec d'autres tags/classes/ids? – addicted

+1

'pas 'signifie littéralement. c'est-à-dire que la classe ne doit pas contenir de classe dans la parenthèse, oui vous pouvez l'utiliser avec un nom de tag et un id comme 'span.b1: not (.a1)'. Vous pouvez vérifier [ici] (https://stackoverflow.com/questions/1028248/how-to-combine-class-and-id-in-css-selector) pour plus d'informations. – Psidom

+0

Merci beaucoup! Ces 3 alternatives sont très utiles. – addicted