¿Cómo iterar sobre todo en un documento python-docx?

Estoy usando python-docx para convertir Word docx a un equivalente HTML personalizado. El documento que necesito convertir tiene imágenes y tablas, pero no he podido averiguar cómo acceder a las imágenes y las tablas en una ejecución determinada. Esto es lo que estoy pensando …

 for para in doc.paragraphs: for run in para.runs: # How to tell if this run has images or tables? 

… pero no veo nada en la Run que tenga información sobre InlineShape o Table . ¿Tengo que recurrir directamente al XML o hay una forma mejor y más limpia de recorrer todo el documento?

¡Gracias!

En realidad, hay dos problemas que resolver para lo que estás tratando de hacer. La primera es iterar sobre todos los elementos a nivel de bloque en el documento, en orden de documento. El segundo es iterar sobre todos los elementos en línea dentro de cada elemento de bloque, en el orden en que aparecen.

python-docx aún no tiene las características que necesitarías para hacer esto directamente. Sin embargo, para el primer problema hay un código de ejemplo aquí que probablemente funcione para usted: https://github.com/python-openxml/python-docx/issues/40

No hay una contraparte exacta que conozca para lidiar con los artículos en línea, pero espero que pueda llegar bastante lejos con los análisis de párrafos. Todo el contenido en línea estará dentro de un párrafo. Si llegaste la mayor parte del camino y quedaste colgado de obtener imágenes o algo, podrías bajar el nivel de lxml y decodificar algunos de los XML para obtener lo que necesitabas. Si llega tan lejos y todavía está interesado, si publica una solicitud de función en la lista de problemas de GitHub para algo como “feature: Paragraph.iter_inline_items ()” Probablemente pueda proporcionarle un código similar para obtener lo que necesita.

Este requisito surge de vez en cuando, por lo que definitivamente queremos agregarlo en algún momento.

Tenga en cuenta que los elementos de nivel de bloque (párrafos y tablas principalmente) pueden aparecer de forma recursiva, y una solución general deberá tenerlo en cuenta. En particular, un párrafo puede (y de hecho, al menos uno siempre debe) aparecer en una celda de la tabla. Una tabla también puede aparecer en una celda de tabla. Así que teóricamente puede llegar a ser bastante profundo. Una función / método recursivo es el enfoque correcto para llegar a todos esos.

Suponiendo que doc es de tipo Document , entonces lo que desea hacer es tener 3 iteraciones separadas:

  • Uno para los párrafos, como lo tienes en tu código.
  • Una para las mesas, a través de doc.tables
  • Una para las formas, a través de doc.inline_shapes

La razón por la que su código no funcionaba era que los párrafos no tienen referencias a las tablas y / o formas dentro del documento, ya que se almacena dentro del objeto Document .

Aquí está la documentación para más información: python-docx