2009-11-18 4 views
4

J'utilise mechanize/nokogiri et j'ai besoin d'analyser la chaîne HTML suivante. quelqu'un peut-il m'aider avec la syntaxe xpath pour le faire ou d'autres méthodes qui fonctionneraient?Ruby Nokogiri Table HTML d'analyse

<table> 
    <tr class="darkRow"> 
    <td> 
     <span> 
     <a href="?x=mSOWNEBYee31H0eV-V6JA0ZejXANJXLsttVxillWOFoykMg5U65P4x7FtTbsosKRbbBPuYvV8nPhET7b5sFeON4aWpbD10Dq"> 
      <span>4242YP</span> 
     </a> 
     </span> 
    </td> 
    <td> 
     <span>Subject of Meeting</span> 
    </td> 
    <td> 
     <span> 
     <span>01:00 PM</span> 
     <span>Nov 11 2009</span> 
     <span>America/New_York</span> 
     </span> 
    </td> 
    <td> 
     <span>30</span> 
    </td> 
    <td> 
     <span> 
     <span>[email protected]</span> 
     </span> 
    </td> 
    <td> 
     <span>39243368</span> 
    </td> 
    </tr> 
    . 
    . 
    . 
    <more table rows with the same format> 
</table> 

Je veux que ce que la sortie

"4242YP","Subject of Meeting","01:00 PM Nov 11 2009 America/New_York","30","[email protected]", "39243368" 
. 
. 
. 
<however many rows exist in the html table> 

Répondre

4

quelque chose comme ça?

items=doc.xpath('//tr').map {|row| row.xpath('.//span/text()').select{|item| item.text.match(/\w+/)}.map {|item| item.text} } 

retours: => [[ "4242YP", "Objet de la réunion", "13:00", "11 nov 2009", "Amérique/New_York", par exemple "30", » @ email.com "," 39243368 "], [" abcdefg "]]

La sélection inclut uniquement les intervalles commençant par des caractères de mot (par exemple, en excluant les espaces de certaines de vos plages). Vous devrez peut-être affiner le filtre "select" pour votre cas spécifique.

J'ai ajouté une ligne minimaliste contenant une partie contenant abcdefg, afin que vous puissiez voir le tableau imbriqué.

+0

n'a pas utilisé votre exemple exactement, mais il m'a fait penser à différentes façons de le faire. Merci pour l'aide! – thomas

+0

Oui, je ne pouvais que risquer de deviner à quel point votre format HTML est prévisible, et à quel point la jonction des travées imbriquées était importante, si bien que vous pouviez travailler à partir de quelque chose de minimaliste. – JasonTrue

0

Voici une partie de la XSL pour transformer votre entrée, si vous avez un transformateur XSL:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="//tr"/> 
</xsl:template> 

<xsl:template match="tr"> 
    "<xsl:value-of select="td/span/a/span"/>","<xsl:value-of select="td[position()=2]/span"/>","<xsl:value-of select="td[position()=3]/span/span[position()=1]"/>" 
</xsl:template> 

</xsl:stylesheet> 

sortie produit se présente comme suit:

"4242YP","Subject of Meeting","01:00 PM" 
"4242YP","Subject of Meeting","01:00 PM" 

(I dupliqués votre première ligne de la table).

Les bits de sélection XSL vous donnent une bonne idée de l'entrée XPATH dont vous auriez besoin pour faire le reste.

Questions connexes