簡體   English   中英

如何使用 python-pptx 從 PowerPoint 中的組形狀中的文本形狀中提取文本。

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM