![](/img/trans.png)
[英]How to extract text from powerpoint text boxes, in their order within the presentation using python-pptx.
[英]How to extract text from a text shape within a Group Shape in powerpoint, using python-pptx.
我的 PowerPoint 幻燈片有許多組形狀,其中有子文本形狀。
早些時候我使用了這段代碼,但它不處理組形狀。
for eachfile in files:
prs = Presentation(eachfile)
textrun=[]
for slide in prs.slides:
for shape in slide.shapes:
if hasattr(shape, "text"):
print(shape.text)
textrun.append(shape.text)
new_list=" ".join(textrun)
text_list.append(new_list)
我正在嘗試從這些子文本框中提取文本。 我已經設法使用 GroupShape.shape 到達這些子元素但是我得到一個錯誤,這些是'property'類型,所以我無法訪問文本或迭代(TypeError:'property' object is not iterable)他們。
from pptx.shapes.group import GroupShape
from pptx import Presentation
for eachfile in files:
prs = Presentation(eachfile)
textrun=[]
for slide in prs.slides:
for shape in slide.shapes:
for text in GroupShape.shapes:
print(text)
然后我想捕獲文本並附加到字符串以進行進一步處理。
所以我的問題是,如何訪問子文本元素並從中提取文本。
我花了很多時間瀏覽文檔和源代碼,但一直無法弄清楚。 任何幫助,將不勝感激。
我認為你需要這樣的東西:
from pptx.enum.shapes import MSO_SHAPE_TYPE
for slide in prs.slides:
# ---only operate on group shapes---
group_shapes = [
shp for shp in slide.shapes
if shp.shape_type == MSO_SHAPE_TYPE.GROUP
]
for group_shape in group_shapes:
for shape in group_shape.shapes:
if shape.has_text_frame:
print(shape.text)
組形狀包含其他形狀,可通過其.shapes
屬性訪問。 它本身不具有.text
屬性。 所以你需要迭代組中的形狀並從每個形狀中獲取文本。
請注意,此解決方案僅深入一層。 遞歸方法可用於深度優先遍歷樹,並從包含組的組中獲取文本(如果有)。
另請注意,並非所有形狀都有文本,因此您必須檢查.has_text_frame
屬性以避免引發異常,例如圖片形狀。
較早的答案遺漏了一些更深層次的“組中組”案例。 組形狀可以包含許多級別的形狀,包括組形狀。 因此,在許多現實生活中,需要在組形狀之間進行遞歸搜索。
上一個答案僅解析其中的一些(向下到組形狀的第二層)。 但即使是圖層組形狀也可能包含更多組。 所以我們需要一個迭代搜索策略。 這最好通過重用上面的代碼來展示,保留第一部分:
from pptx.shapes.group import GroupShape
from pptx import Presentation
for eachfile in files:
prs = Presentation(eachfile)
textrun=[]
for slide in prs.slides:
for shape in slide.shapes:
然后我們需要將“for text in GroupShape.shapes:”測試替換為對遞歸部分的調用:
textrun=checkrecursivelyfortext(slide.shapes,textrun)
並插入函數的新遞歸函數定義(如在 import 語句之后)。 為了便於比較,插入的函數使用了與上面相同的代碼,只是添加了遞歸部分:
def checkrecursivelyfortext(shpthissetofshapes,textrun):
for shape in shpthissetofshapes:
if shape.shape_type == MSO_SHAPE_TYPE.GROUP:
textrun=checkrecursivelyfortext(shape.shapes,textrun)
else:
if hasattr(shape, "text"):
print(shape.text)
textrun.append(shape.text)
return textrun
Mats Bengtsson 的回答是正確的,除了邏輯錯誤中的一個小錯誤會導致它重新循環對象、一些非 python 命名和丟失的導入。
錯誤在這里:
for slide in prs.slides:
for shape in slide.shapes:
textrun = checkrecursivelyfortext(slide.shapes,textrun)
由於他創建的函數循環遍歷 slide.shapes 中的所有形狀,最終結果是對於幻燈片上的每個形狀,它將遞歸遍歷幻燈片上的所有形狀!
這個修復很簡單,只需刪除“for shape in slide.shapes”的第二個循環並直接進入遞歸函數。
為了便於閱讀,我將發布整個固定片段。
from pptx.shapes.group import GroupShape
from pptx.enum.shapes import MSO_SHAPE_TYPE
from pptx import Presentation
def check_recursively_for_text(this_set_of_shapes, text_run):
for shape in this_set_of_shapes:
if shape.shape_type == MSO_SHAPE_TYPE.GROUP:
check_recursively_for_text(shape.shapes, text_run)
else:
if hasattr(shape, "text"):
print(shape.text)
text_run.append(shape.text)
return text_run
for eachfile in files:
prs = Presentation(eachfile)
text_run=[]
for slide in prs.slides:
text_run = check_recursively_for_text(slide.shapes, text_run)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.