r - xpathApply sur XMLNodeSet (avec paquet XML)
Je suis en train d'utiliser xpathApply fonction dans le paquet XML dans la R d'extraire certaines données à partir d'un fichier html.
Cependant, après que j'ai utiliser xpathApply sur certains nœuds parents du document html, la classe de l'objet devient XMLNodeSet, et je ne peut plus utiliser xpathApply sur cet objet, que ce message d'erreur apparaît: “Erreur dans le UseMethod("xpathApply") : non applicable méthode pour "xpathApply" appliqué à un objet de la classe "XMLNodeSet"”
Voici le script R je suis en train d'essayer de reproduire mon problème (cet exemple n'est qu'une simple table, je sais que je peux utiliser readHTMLtable fonction, mais j'ai besoin d'utiliser plus faible niveau de la fonction de travail parce que mon html est plus complexe que cette simple table):
library(XML)
y <- htmlParse(htmlfile)
x <- xpathApply(y, "//table/tr")
z <- xpathApply(x, "/td")
Ici est le “htmlfile”:
<table>
<tr>
<td> Test1.1 </td> <td> Test1.2 </td>
</tr>
<tr>
<td> Test1.3 </td> <td> Test1.4 </td>
</tr>
</table>
Est il une méthode pour la poursuite des travaux sur les nœuds après l'utilisation de xpathApply? Ou il y a des bonnes alternatives à jouer autour de la data dans les nœuds?
OriginalL'auteur Joyce | 2013-02-19
Vous devez vous connecter pour publier un commentaire.
Une fois que vous avez une liste de noeud, vous pouvez appliquer la fonction sur l'oibt extraire le nœud. Fonction comme
xmlValue
ouxmlGetAttr
....Par exemple :
Qui est équivalent à faire :
MODIFIER
Je suis sûr que vous en question peut être résolue par le droit de xpath. Vous devez apprendre à travailler avec des fichiers xml que vous travaillez avec une base de données . xpath est juste analogue à une requête sql. il est rapide et plusieurs navigateurs peuvent vous aider à générer le droit de xpath.
Par exemple :
MODIFIER
L'OP est comme si il wantes à reproduire la structure XML ( obtenir de tr et td dans le même ordre)
ici est le chemin , je ne pense pas que est la façon la plus efficace ...
Si si le nombre de td sont tous les mêmes dans chaque tr, vous pouvez remplacer
lapply
parsapply
et vous obtenez :Mais je pense que dans ce cas readHtmlTable est mieux..
Je suis en attente pour vous de répondre à préciser qu'entendez-vous par la poursuite de la recherche les résultats...
Je veux dire qu'il veut de recherche pour les sous-éléments de la suite.
td
dans ce casMerci pour les discussions et suggestions. En fait, je tiens à souligner et d'extraire des éléments à la commodité, disent si je veux obtenir une seconde tr première td, alors je peux obtenir le "Test1.3"; ou s'il y a trois td en seond tr au lieu de deux (tout premier tr inchangé et ne compte encore que deux td, dans ce cas, il n'est pas un tableau plus), si je veux obtenir le troisième td de deuxième tr, je peux facilement le point de que et. C'est pourquoi j'ai dit que je veux faire xpathApply deux fois. Est-il possible de faire cela?
vous pouvez voir mon edit.
OriginalL'auteur agstudy
Bien que la solution de la définition de la bonne xPath semble être meilleur que vous pouvez faire ceci:
OriginalL'auteur c0bra
Suivantes semblent être au travail. Essentiellement, vous devez rechercher les éléments de la liste retournée par
xpathApply
PS: je ne suis pas sûr de savoir pourquoi il recherche tous les éléments de
x
liste plutôt que de simplementx[[1]]
. Semble comme un bug.xpathSApply
quelque chose commexpathSApply(y,"//table/tr/td",I)
ce dernier commentaire a vraiment aidé!
Je pense que vous trouverez toutes les
td
éléments, parce//
signifie à partir de la racine; vous devriez avoir rédigé"./td"
.OriginalL'auteur Chinmay Patil