2012-06-15 21 views
5

estoy a programar algunos Perl para utilizar XPath para localizar un elemento particular dentro de un td table` que se parece a esteexpresión XPath para contener los elementos de un nodo de texto dado

<table> 
    <tr> 
     <td>...</td> 
     <td><font color="white" face="verdana, Helvetica, Arial" size="2">Showing <b>1</b>-<b>100</b> of <b>200</b> total</font></td> 
     <td>...</td> 
     <td>...</td> 
    </tr> 
    </table> 

Lo que quiero es encontrar una td elemento que tiene un nodo font/text() que contiene la cadena Showing.

partidos contains(., "Showing")

Una comparación directa funciona bien:

//td[font/text()="Showing "] 

pero quieren utilizar la función XPath para que el partido es más flexible.

He tratado

//td[contains(font/text(), "Showing ")] 

pero esto plantea el error

XPath failed due to: A sequence of more than one item is not allowed as the first argument of contains() 

y he podido lograr lo que quiero con

//td[font/text()[contains(., "Showing")]] 

pero esto es muy feo y yo Estoy esperando algo más conciso. Por favor, ¿alguien puede mejorar esto para mí o quizás confirmar que esta es la mejor y más concisa manera?

+0

más concisa? Usted tiene un xpath que dice "Todos los' td's que tienen una 'fuente' cuyo texto contiene' Showing' "- ¡que es exactamente su enunciado de problema! - ¿Y quieres que sea más conciso? – AakashM

+0

@AakashM: Sí, lo hago. Solo porque es * una * forma de expresar lo que quiero no significa que sea el * más limpio *. No tengo que escribir '//td[font/text()[.="Showing"]] 'así que pensé que podría haber una forma de usar' contains' en lugar de '='. – Borodin

+1

Entonces, ¿por qué crees que la expresión es "muy fea"? Es el que usaría, y esto significa que, al menos que yo sepa, no hay uno más elegante. –

Respuesta

7

Prueba esto:

//td[contains(font/text()[1], 'Showing ')] 
+1

Gracias Kirill. Eso funciona, pero solo si es el primer nodo de texto que coincide. Quiero encontrar un 'td' donde cualquier' font/text() 'contiene la cadena dada. – Borodin

+0

@Borodin Te refieres a esto: '// td [contains (font/text(), 'Showing')]'? – toniedzwiedz

+0

@Borodin, según la especificación XPath, si un argumento no es de tipo 'cadena', primero se convierte en una cadena usando la función' cadena() 'y luego se evalúa el resultado de esa conversión. Entonces su motor XPath no funciona correctamente. –

Cuestiones relacionadas