2017-06-28 5 views
0

J'essaie d'extraire des données à partir du document html avec le paquet XML. je vais comme suit:R-extraire des données de XMLNodeSet

library(XML) 
sink("parse.txt") 
parse<-htmlParse(file = "jdwaz.html",encoding = "GBK") 
a=getNodeSet(parse,'//div[@class="amount"]') 
print(a) 

puis classe (a) retourne "XMLNodeSet", son contenu ressemble à ceci dans le fichier txt

[[1]] 
<div class="amount"> 
        <span>总额 ¥113.80</span> <br /><span class="ftx-13">在线支付</span> 
            </div> 

[[2]] 
<div class="amount"> 
        <span>总额 ¥99.00</span> <br /><span class="ftx-13">在线支付</span> 
            </div> 

Je ne montrent que 2 de 20 "a"

class (a [1]) renvoie "list" Je souhaite obtenir le contenu "总额 ¥ 99.00". J'ai trouvé une méthode dans r - xpathApply on XMLNodeSet (with XML package) Il XMLValue utilise pour obtenir un texte comme:

x <- xpathApply(y, "//table/tr") 
sapply(x,xmlValue)   ## it a list of nodes.. 
" Test1.1 Test1.2 " " Test1.3 Test1.4 " 

mais il ne correspond pas à ma situation. Quand je rentre XMLValue (a), il retourne:

Error in UseMethod("xmlValue") : no applicable method for 'xmlValue' applied to an object of class "XMLNodeSet" 

Je ne trouve pas la méthode appropriée pour traiter XMLNodeSet classe. AIDE!

+0

@Zelbinian Je vous ai trouvé demandé question qui est pertinente à ma question, je me demande si vous pouvez me aider – listen

Répondre

0

Pour interroger un ensemble de nœuds XML, utilisez un "." donc c'est relatif au nœud actuel. Puisque vous avez deux balises span, obtenez celui sans l'attribut class.

sapply(a, function(x) xpathSApply(x, ".//span[not(@class)]", xmlValue)) #OR 
sapply(a, xpathSApply, ".//span[not(@class)]", xmlValue) 
[1] "总额 ¥113.80" "总额 ¥99.00" 
+0

merci beaucoup, j'utilise **/span/texte() ** pour obtenir le contenu entre un paire d'étiquettes maintenant j'ai une nouvelle question, j'utilise xmlGetAttr pour obtenir du contenu dans <> par exemple, la le contenu que je veux est en ** chinois **, alors R retourne le contenu dans des mots faux. Je suppose que c'est à cause du codage, mais il n'y a pas de fonction inxmlGetAttr définie. Triste…. – listen

+0

J'ai trouvé la fonction ** iconv **, cela aide avec le problème d'encodage! – listen