如何使用 python-docx 阅读源自 Word 模板的 docx?
How to read docx originated from Word templates with python-docx?
我正在使用 python-docx 库获取 docx 文件 的所有文本。简化代码如下
from docx import Document
def read_element(doc):
for p in doc.paragraphs:
print('paragraph text:', p.text)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
read_element(cell)
doc = Document("<path to file>")
read_element(doc)
这在很多情况下都很有效,但当我正在阅读通过 Microsoft Word 模板生成的文件时除外。在那些情况下,它只读取我在文件中写的输入,而不是模板附带的文本
复制
- 通过
Create from template
创建 Microsoft Word 文档
- 在其中写一个字,即“测试”
- 保存
- 替换上面代码中的路径
- 运行代码
输出:
paragraph text: testing
paragraph text: To learn more and get OneNote, visit .
当文件中的文本多于输出内容时
Take Notes testing
- To take notes, just tap here and start typing.
- Or, easily create a digital notebook for all your notes that automatically syncs across your devices, using the free OneNote app.
To learn more and get OneNote, visit www.onenote.com.
正如我们在试图读取的文件图像中看到的那样 Docx file
关于如何检索丢失的文本有什么想法吗?
python-docx
只会在文档的 顶级 找到段落和表格。特别是,将不会检测到“包裹”在“容器”元素中的段落或表格。
最常见的是,“容器”是待定(尚未接受)的修订版,这会产生类似的行为。
要提取“包装”文本,您需要知道“包装”元素是什么。一种方法是转储文档正文的 XML:
document = Document("my-document.docx")
print(document._body._body.xml)
一个段落元素有一个 w:p
标签,您可以检查输出以查找这些标签,我预计其中一些会在 内部 另一个元素中。
然后你可以用 XPath 表达式提取那些元素,像这样,如果“wrapper”元素是 <w:x>
:
from docx.text.paragraph import Paragraph
body = document._body._body
ps_under_xs = body.xpath("w:x//w:p")
for p in ps_under_xs:
paragraph = Paragraph(p, None)
print(paragraph.text)
您也可以只获取文档中的所有 <w:p>
元素,而不考虑它们的“出身”,如下所示:
ps = body.xpath(".//w:p")
这样做的缺点是某些容器(如未接受的修订标记)可能包含已从文档中“删除”的文本,因此您可能会得到比您想要的更多的内容。
无论如何,这种通用方法应该适用于您所描述的工作。如果您需要更复杂的东西,您可以在搜索中找到有关 XPath 表达式的更多信息。
我正在使用 python-docx 库获取 docx 文件 的所有文本。简化代码如下
from docx import Document
def read_element(doc):
for p in doc.paragraphs:
print('paragraph text:', p.text)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
read_element(cell)
doc = Document("<path to file>")
read_element(doc)
这在很多情况下都很有效,但当我正在阅读通过 Microsoft Word 模板生成的文件时除外。在那些情况下,它只读取我在文件中写的输入,而不是模板附带的文本
复制
- 通过
Create from template
创建 Microsoft Word 文档
- 在其中写一个字,即“测试”
- 保存
- 替换上面代码中的路径
- 运行代码
输出:
paragraph text: testing
paragraph text: To learn more and get OneNote, visit .
当文件中的文本多于输出内容时
Take Notes testing
- To take notes, just tap here and start typing.
- Or, easily create a digital notebook for all your notes that automatically syncs across your devices, using the free OneNote app.
To learn more and get OneNote, visit www.onenote.com.
正如我们在试图读取的文件图像中看到的那样 Docx file
关于如何检索丢失的文本有什么想法吗?
python-docx
只会在文档的 顶级 找到段落和表格。特别是,将不会检测到“包裹”在“容器”元素中的段落或表格。
最常见的是,“容器”是待定(尚未接受)的修订版,这会产生类似的行为。
要提取“包装”文本,您需要知道“包装”元素是什么。一种方法是转储文档正文的 XML:
document = Document("my-document.docx")
print(document._body._body.xml)
一个段落元素有一个 w:p
标签,您可以检查输出以查找这些标签,我预计其中一些会在 内部 另一个元素中。
然后你可以用 XPath 表达式提取那些元素,像这样,如果“wrapper”元素是 <w:x>
:
from docx.text.paragraph import Paragraph
body = document._body._body
ps_under_xs = body.xpath("w:x//w:p")
for p in ps_under_xs:
paragraph = Paragraph(p, None)
print(paragraph.text)
您也可以只获取文档中的所有 <w:p>
元素,而不考虑它们的“出身”,如下所示:
ps = body.xpath(".//w:p")
这样做的缺点是某些容器(如未接受的修订标记)可能包含已从文档中“删除”的文本,因此您可能会得到比您想要的更多的内容。
无论如何,这种通用方法应该适用于您所描述的工作。如果您需要更复杂的东西,您可以在搜索中找到有关 XPath 表达式的更多信息。