如何使用 python-docx 从 docx 文档中提取索引标记数据?
How can I extract index marker data from a docx document using python-docx?
给定一个简单的段落block
,我想从中提取索引标记数据。
像这样的简单代码:
print(block.text)
for run in block.runs:
print(run)
将打印出段落文本和相关联的 运行 列表,其中一个(据我所知)包含一个特殊的 XE(索引条目)字段。
This is a test.
<docx.text.run.Run object at 0x7f800f369c50>
<docx.text.run.Run object at 0x7f800f369da0>
<docx.text.run.Run object at 0x7f800f369dd8>
<docx.text.run.Run object at 0x7f800f369c18>
<docx.text.run.Run object at 0x7f800f369e48>
<docx.text.run.Run object at 0x7f800f369eb8>
<docx.text.run.Run object at 0x7f800f369f28>
我需要从 运行 中提取数据,其中包含索引标记和 运行 在段落中的位置(即第 n 个字符)。
我在 python-docx 库中遗漏的 api 是否有帮助?
或者,我应该解析原始 XML 吗?我怎样才能得到段落的原始 XML?
谢谢!!
为此,您可以下拉到 lxml/oxml
层。
您需要某种“外部”循环来跟踪当前偏移量。生成器函数可能对此很方便。
def iter_xe_runs_with_offsets(paragraph):
"""Generate (run, run_idx, text_offset) triples from `paragraph`."""
text_offset = 0
for run_idx, run in enumerate(paragraph.runs):
if contains_index_marker(run):
yield (run, run_idx, text_offset)
text_offset += len(run.text)
然后一个处理方法可以用它来做需要的事情:
def process_paragraph(paragraph):
for run, run_idx, text_offset in iter_xe_runs_with_offsets(paragraph):
# ... do the needful ...
并且你需要一个辅助助手来判断运行是否有索引标记。这将在 run._r
运行 元素对象上使用 lxml.etree._Element
方法。
def contains_index_marker(run):
"""Return True if `run` is marked as index entry."""
r = run._r
# ... use lxml on `r` to identify presence of "index marker"
# the code to do that depends on whether it is an attribute or
# child element.
给定一个简单的段落block
,我想从中提取索引标记数据。
像这样的简单代码:
print(block.text)
for run in block.runs:
print(run)
将打印出段落文本和相关联的 运行 列表,其中一个(据我所知)包含一个特殊的 XE(索引条目)字段。
This is a test.
<docx.text.run.Run object at 0x7f800f369c50>
<docx.text.run.Run object at 0x7f800f369da0>
<docx.text.run.Run object at 0x7f800f369dd8>
<docx.text.run.Run object at 0x7f800f369c18>
<docx.text.run.Run object at 0x7f800f369e48>
<docx.text.run.Run object at 0x7f800f369eb8>
<docx.text.run.Run object at 0x7f800f369f28>
我需要从 运行 中提取数据,其中包含索引标记和 运行 在段落中的位置(即第 n 个字符)。
我在 python-docx 库中遗漏的 api 是否有帮助? 或者,我应该解析原始 XML 吗?我怎样才能得到段落的原始 XML?
谢谢!!
为此,您可以下拉到 lxml/oxml
层。
您需要某种“外部”循环来跟踪当前偏移量。生成器函数可能对此很方便。
def iter_xe_runs_with_offsets(paragraph):
"""Generate (run, run_idx, text_offset) triples from `paragraph`."""
text_offset = 0
for run_idx, run in enumerate(paragraph.runs):
if contains_index_marker(run):
yield (run, run_idx, text_offset)
text_offset += len(run.text)
然后一个处理方法可以用它来做需要的事情:
def process_paragraph(paragraph):
for run, run_idx, text_offset in iter_xe_runs_with_offsets(paragraph):
# ... do the needful ...
并且你需要一个辅助助手来判断运行是否有索引标记。这将在 run._r
运行 元素对象上使用 lxml.etree._Element
方法。
def contains_index_marker(run):
"""Return True if `run` is marked as index entry."""
r = run._r
# ... use lxml on `r` to identify presence of "index marker"
# the code to do that depends on whether it is an attribute or
# child element.