2012-03-10 12 views
8

Espero que alguien pueda dirigirme rápidamente en la dirección correcta con mis dificultades XPath.XPath para localizar una celda con texto específico que analiza tablas HTML

Actual Llegué al punto en el que identifico la tabla correcta que necesito en mi fuente HTML pero luego necesito procesar solo las filas que tienen el texto 'Capítulo' en algún lugar del DOM.

Mi último intento fue hacer esto:

// get the correct table 
HtmlTable table = page.getFirstByXPath("//table[2]"); 

// now the failing bit.... 
def rows = table.getByXPath("*/td[contains(text(),'Chapter')]") 

pensé que el XPath anterior representaría, dame todos los elementos que tienen un siguiente elemento secundario de 'td' que en algún lugar en su dom contiene el texto ' capítulo'

un ejemplo de una fila a juego de mi fuente es:

<tr valign="top"> 
    <td nowrap="" align="Right"> 
    <font face="Verdana"> 
    <a href="index.cfm?a=1">Chapter 1</a> 
    </font> 
    </td> 
    <td class="ChapterT"> 
    <font face="Verdana">DEFINITIONS</font> 
    </td> 
    <td>&nbsp;</td> 
</tr> 

Cualquier ayuda/punteros muy apreciados.

Gracias,

Respuesta

12

Utilice esta XPath:

//td[contains(., 'Chapter')] 
+0

Gracias, eso parece funcionar Lo que hace el '.' ¿representar? Además, no entiendo por qué la detección 'reletive' no funciona, p. tienes // que, como yo entiendo, significa comenzar en la raíz? – Dave

+0

@Dave, De nada. '.' y' // 'es la sintaxis abreviada de XPath. '.' selecciona el nodo de contexto. '// td' selecciona todos los descendientes' td' de la raíz del documento y, por lo tanto, selecciona todos los elementos 'td' en el mismo documento que el nodo de contexto. * Referencia *: http://www.w3.org/TR/xpath/#path-abbrev –

2

Su en el "camino" correcto.
La función contains() está limitada a un elemento específico, no a texto en ninguno de los elementos secundarios. Prueba este XPath, que se podía leer la siguiente manera: - conseguir cada tr/td con cualquier elemento secundario que contiene el texto 'Capítulo'

tr/td[contains(*,"Chapter")] 

Buena suerte

+0

Hola William, nos dio una oportunidad, pero no pudo conseguir para devolver algo Lo que funcionó, aunque no parece ser el más eficiente, es un solo liner de ' def chapterAnchors = page.anchors.findAll {HtmlAnchor a -> a.asText(). Contains (' Chapter ')}' – Dave

7

desea que todos los td s bajo su nodo actual - no - todo en el documentocomo la respuesta aceptada actualmente se aspectos.

Uso:

.//td[.//text()[contains(., 'Chapter')]] 

Esto selecciona todos los td descendientes del nodo actual que se denominan td que tienen al menos un descendiente nodo de texto, cuyo valor de cadena contiene la cadena "Chapter".

si se sabe de antemano que cualquier td bajo esta table sólo tiene un nodo de texto sencillo, esto se puede simplificar a solo:

.//td[contains(., 'Chapter')] 
Cuestiones relacionadas