我正在使用docx.Document提取docx文件中的一些突出显示的文本/单词,但结果非常奇怪,因为提取的一些单词被分成了碎片,如下所示:
['sniffle', 'irritations', 'enzymes', 'abrasive', 'immunoglobulins', 'histamine', 'leukotriene', 'predisposition', 'an', 'aphylaxis', 'syndrome', 'angioedema', 'contact', 'dermatitis', 'frightening', 'tingling', 'eczema', 'nausea', 'wheezing', 'anaphylaxis', 'lump', 'epinephrine', 'venom sac', 'scrape', 'ointment', 'hydrocortisone', 'calamine', 'loose-fitting', 'swatting', 'birch', 'fact sheet', 'urticarial', 'A', 'ngioedema']
“an”、“aphylaxis”实际上来自单词“anaphylaxis”, “A”、“ngioedema”实际上来自“Angioedema”一词
我没有以错误的方式突出显示这两个单词,例如先突出显示“A”,然后突出显示“ngioedema”,这是荒谬的。
逻辑很简单: 打开docx --> 使用段落/运行来浏览文本 --> 将突出显示的单词保存在列表中
def preProcess(filepath):
document = docx.Document(filepath)
for para in document.paragraphs:
for run in para.runs:
if run.font.highlight_color == WD_COLOR_INDEX.YELLOW:
keyText.append((run.text.lstrip()).rstrip())
for key in keyText:
if '' in keyText:
keyText.remove('')
extractWdFrmDocx(keyText)
显然,提取时,一个单词不能被破坏
最佳答案
段落中的文本可以在任意点分成多个段落,单个单词跨越多个段落的情况很常见。因此,不能保证游程发生在字边界处。如果您想提取突出显示的单词,您将需要更复杂的方法。
一种方法是将 paragraph.text
拆分为单词,这样您还可以知道运行中每个单词的第一个字符的起始偏移量。然后,您可以遍历运行以识别那些突出显示的运行,累积每次运行开始的偏移量。
您需要一些巧妙的逻辑来识别突出显示的单词中的单词,但提到的所有信息都应该是您执行此操作所需的全部信息。
因此,对于文本为“突出显示的单词”的段落,您的单词偏移量将为:
(0, "a"), (2, "highlighted"), (14, "word")
您突出显示的运行(偏移、长度)对可能是:
(2, 4), (6, 7)
据此,您可以计算出(2,突出显示)
的第一个字符被突出显示,并且突出显示在单词的其余部分中是连续的。
您可以简化逻辑,选择第一个字符突出显示的任何整个单词,而不必担心从单词中间开始的运行,具体取决于您的需要。
关于python - 这是我的函数或 Python 中的 docx.Document 的缺陷吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57917725/