¿Cómo hacer que XPath seleccione varios elementos de la tabla con atributos de ID idénticos?

Actualmente estoy tratando de extraer información de una página web mal formateada. Específicamente, la página ha usado el mismo atributo de identificación para varios elementos de la tabla. El marcado es equivalente a algo como esto:

   

Claramente, este formato HTML es incorrecto, debido al uso múltiple de la misma ID para un elemento.

Estoy usando XPath para intentar extraer todo el texto en los diversos elementos de la tabla, utilizando el lenguaje a través del marco de Scrapy .

Mi llamada, se ve algo como esto:

 hxs.select('//div[contains(@id, "random_div")]//table[@id="table_1"]//text()').extract() 

Por lo tanto, la expresión XPath es: //div[contains(@id, "random_id")]//table[@id="table_1"]//text()

Esto devuelve: [u'Important text 1.'] , es decir, el contenido de la primera tabla que coincide con el valor de id “table_1”. Me parece que una vez que se ha topado con un elemento con cierto id, ignora cualquier ocurrencia futura en el marcado. ¿Alguien puede confirmar esto?

ACTUALIZAR

Gracias por las respuestas rápidas a continuación. He probado mi código en una página alojada localmente, que tiene el mismo formato de prueba anterior y se devuelve la respuesta correcta, es decir,

 `[u'Important text 1.', u'Important text 2.', . . . . ,u'Important text 5.']` 

Por lo tanto, no hay nada de malo con la expresión Xpath o con las llamadas de Python que estoy haciendo.

Supongo que esto significa que hay un problema en la página web en sí mismo, que es un libxml2 XPath o el analizador html, que es libxml2 .

¿Alguien tiene algún consejo sobre cómo puedo profundizar un poco más en esto?

ACTUALIZACIÓN 2

He aislado con éxito el problema. En realidad, es con la biblioteca de análisis subyacente, que es lxml (que proporciona enlaces de Python para la biblioteca C de libxml2 .

El problema es que el analizador no puede manejar las tabs verticales. No tengo idea de quién codificó el sitio con el que estoy tratando, pero está lleno de tabs verticales. El navegador web parece ser capaz de ignorar estos, por lo que la ejecución de las consultas XPath de Firebug en el sitio en cuestión, por ejemplo, es exitosa.

Además, debido a que el ejemplo simplificado anterior no contiene tabs verticales, funciona bien. Para cualquier persona que se encuentre con este problema en Scrapy (o en Python en general), la siguiente solución funcionó para mí, para eliminar las tabs verticales de las respuestas html:

 def parse_item(self, response): # remove all vertical tabs from the html response response.body = filter(lambda c: c != "\v", response.body) hxs = HtmlXPathSelector(response) items = hxs.select('//div[contains(@id, \"random_div\")]' \ '//table[@id="table_1"]//text()').extract() 

Con Firebug, esta expresión:

 //table[@id='table_1']//td/text() 

me da esto:

 [, , , , ] 

td filtro td para dar un mejor resultado, ya que de lo contrario, obtendría el espacio en blanco y las nuevas líneas entre las tags. Pero en general, parece funcionar.

Noté que usted consulta //div[contains(@id, "random_id")] , mientras que su fragmento de código HTML tiene una etiqueta que dice

_id y _div son diferentes. No conozco a Scrapy, así que realmente no puedo decir si eso hace algo, pero ¿no podría ser ese también tu problema?

 count(//div[@id = "random_div"]/table[@id= "table_1"]) 

Este xpath devuelve 3 para su entrada de muestra. Por lo tanto, su problema no es con la xpath en sí, sino con las funciones que utiliza para extraer los nodos.