2012-11-30 7 views
4

Je suis nouveau sur XPath - s'il vous plaît allez-y doucement.R XML + XPath - getNodeSet avec plusieurs conditions

J'ai du mal à extraire XPath sur mes pages cibles pour les éléments qui n'ont pas beaucoup de structure.

L'ensemble de données est l'école NJ report cards. bulletins individuels ressemblent this

J'ai compris comment tirer sur les tables qui ont une étiquette summary:

url <- paste("http://education.state.nj.us/rc/rc11/rcreport.php?c=", 
    all_sch[i,1],";d=",all_sch[i,2],";s=",all_sch[i,3],sep = '') 
doc = htmlParse(url) 
admin_salaries = getNodeSet(doc, '//table[@summary="Administrative Salaries and Benefits"]') 

mais ai du mal où il n'y a pas beaucoup d'informations d'identification supplémentaire pour travailler hors du.

Par exemple, la table qui a le nom de l'école et du quartier ressemble à ceci:

 <table cellpadding="0" cellspacing="0"> 
      <tr> 
      <td><strong>SCHOOL:</strong></td> 
      <td>&nbsp;New Jersey Ave</td> 
      </tr> 
      <tr> 
      <td><strong>COUNTY:</strong></td> 
      <td>&nbsp;Atlantic</td> 
      </tr> 
      <tr> 
      <td><strong>DISTRICT:</strong></td> 
      <td>&nbsp;Atlantic City</td> 
      </tr> 
     </table> 

Ma stratégie ici est « trouver des noeuds qui sont des tables et ont le texte COUNTY

Reading autant que je pouvez sur XPath, j'essaie ceci:

names = getNodeSet(doc,'//table and //*[contains(text(),"COUNTY")]') 

Mais au lieu de revenir en arrière le nœud de la table, il me donne unbooléenvaleur. Donc, la question est: Comment utiliser XPath pour trouver des tables qui ont le texte COUNTY et SCHOOL?

J'ai essayé beaucoup d'autres stratégies en vain. Une approche suggérée par d'autres était tout simplement de retirer toutes les données de la table cellule en utilisant quelque chose comme ceci:

xpathApply(htmlTreeParse(url, useInt=T), "//td", function(x) xmlValue(x)) 

Mais les modèles ne sont pas compatibles pour les données manquantes - des rapports incomplets ont une structure assez différente, et les éléments ne sont pas en la même position sur les 2 000 pages et plus.

Toute aide est grandement appréciée!

Répondre

5

utilisant XPath, pour obtenir toutes les tables

xpathSApply(doc, "//table[contains(.,'SCHOOL:') 
        and contains(.,'COUNTY') ]",xmlValue) 

Pour obtenir juste la ligne

xpathSApply(doc, "//tr/td[contains(.,'SCHOOL:') 
        and contains(.,'COUNTY') ]",xmlValue) 
+0

fonctionne parfaitement. Merci! – Andrew