Dokumen kata saya berisi beberapa baris font simbol yang tidak direkam sebagai teks. Ketika saya menggunakan python-docx untuk melihat xml yang mendasarinya, saya dapat melihat garis yang tidak dicetak terlihat seperti ini:

<w:sym w:font="Symbol" w:char="F0B3"/>

Tetapi python-docx benar-benar mengabaikan tag w:sym. Seolah-olah mereka tidak ada sama sekali ketika saya mengekstraksi teks. Itu berarti saya tidak bisa begitu saja menemukan dan mengganti simbol dengan format yang benar. Saya harus dapat menggantinya sebelum mengekstrak tabel dan teks dari dokumen saya.

Bagaimana saya bisa mengubah elemen pohon di atas menjadi versi w:t seperti ini:

<w:t>≥</w:t>

Saya benar-benar baik-baik saja menyiapkan kamus untuk penggantian baris penuh. Saya tidak tahu bagaimana melakukannya tanpa merusak file xml.

0
Cazforshort 12 Mei 2021, 15:49

2 jawaban

Jawaban Terbaik

Ini tidak didukung oleh python-docx API. Anda harus mengedit XML dengan cara lain.

python-docx dapat memberi Anda akses ke elemen XML paragraf (<w:p>) dalam bentuk objek lxml.etree._Element dan kemudian Anda dapat menggunakan API tersebut untuk memanipulasi turunannya. Ide dasarnya adalah menyisipkan elemen <w:t> baru di mana pun Anda menemukan elemen w:sym dan kemudian menghapus elemen w:sym.

Dokumen API lxml.etree._Element ada di sini: https://lxml.de /api/lxml.etree._Element-class.html. Kodenya mungkin terlihat seperti ini:

p = paragraph._p
for child_element in list(p):
    if child_element.tag != "w:sym":
        continue
    new_t_element = ...
    child_element.addprevious(new_t_element)
    p.remove(child_element)

Masih ada detail yang harus diselesaikan, tetapi mudah-mudahan ini memberi Anda arah untuk dikejar. Mungkin Anda dapat memposting solusi Anda di sini setelah Anda menyelesaikan detailnya.

1
scanny 12 Mei 2021, 16:35

Jika Anda kurang beruntung dengan python-docx xsl 1.0 ini adalah alternatif:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  
  <!-- Identity template : copy all text nodes, elements and attributes -->   
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="w:sym[@w:font='Symbol' and @w:char='F0B3']">
    <w:t>≥</w:t>
  </xsl:template>
  
</xsl:stylesheet>
1
Siebe Jongebloed 12 Mei 2021, 16:29