Tiaohh
April 16, 2024, 8:36am
12
for paragraph in doc.get_child_nodes(aw.NodeType.PARAGRAPH, True):
try:
node = paragraph.as_paragraph()
level = 1
if node.get_ancestor(aw.NodeType.TABLE) == None:
if node.paragraph_format.outline_level in [0, 1, 2, 3, 4, 5]:
level = int(node.paragraph_format.outline_level) + 1
if level > current_level:
# 如果级别更深,将当前标题添加到堆栈
stack.append((current_level, data))
data = []
current_level = level
elif level < current_level:
# 如果级别更浅,将堆栈中的项添加回数据
while stack and stack[-1][0] >= level:
old_level, old_data = stack.pop()
data = old_data + data
current_level = old_level
data.append(
{
"Title": node.get_text(),
"Content": [],
"Level": level,
"Table": [],
"Tbale_name": [],
}
)
else:
if data:
if node.get_text().startswith("表"):
if (
"Bullet" in node.paragraph_format.style.name
or "Caption" in node.paragraph_format.style.name
):
data[-1]["Tbale_name"].append(
node.get_text().strip("SEQ 表 \* ARABIC").strip("SEQ")
)
if (
node.get_text().startswith("表")
or node.get_text().startswith("来源:")
or node.get_text().startswith("图")
):
pass
else:
data[-1]["Content"].append(node.get_text())
if node.get_ancestor(aw.NodeType.TABLE) != None:
print(11111)
parent_node = node.get_ancestor(aw.NodeType.TABLE).as_table()
with concurrent.futures.ThreadPoolExecutor() as executor:
able_content = executor.submit(read_table, parent_node).result()
print(able_content)
data[-1]["Table"].append(able_content)
except Exception as e:
print(e)
while stack:
old_level, old_data = stack.pop()
data = old_data + data。
就是文档里面存在图片 我想根据标题获取下面的图片信息
Tiaohh
April 16, 2024, 10:03am
16
for paragraph in doc.get_child_nodes(aw.NodeType.PARAGRAPH, True):
try:
node = paragraph.as_paragraph()
level = 1
if node.get_ancestor(aw.NodeType.TABLE) == None:
if node.paragraph_format.outline_level in [0, 1, 2, 3, 4, 5]:
level = int(node.paragraph_format.outline_level) + 1
if level > current_level:
# 如果级别更深,将当前标题添加到堆栈
stack.append((current_level, data))
data = []
current_level = level
elif level < current_level:
# 如果级别更浅,将堆栈中的项添加回数据
while stack and stack[-1][0] >= level:
old_level, old_data = stack.pop()
data = old_data + data
current_level = old_level
data.append(
{
"Title": node.get_text(),
"Content": [],
"Level": level,
"Table": [],
"Tbale_name": [],
}
)
else:
if data:
if node.get_text().startswith("表"):
if (
"Bullet" in node.paragraph_format.style.name
or "Caption" in node.paragraph_format.style.name
):
data[-1]["Tbale_name"].append(
node.get_text().strip("SEQ 表 \* ARABIC").strip("SEQ")
)
if (
node.get_text().startswith("表")
or node.get_text().startswith("来源:")
or node.get_text().startswith("图")
):
pass
else:
data[-1]["Content"].append(node.get_text())
if node.get_ancestor(aw.NodeType.TABLE) != None:
print(11111)
parent_node = node.get_ancestor(aw.NodeType.TABLE).as_table()
with concurrent.futures.ThreadPoolExecutor() as executor:
able_content = executor.submit(read_table, parent_node).result()
print(able_content)
data[-1]["Table"].append(able_content)
except Exception as e:
print(e)
while stack:
old_level, old_data = stack.pop()
data = old_data + data。表格数据也不对啊 为什么一直循环一个段落的表格呢?
@Tiaohh 请附上您的输入文档(如果可能的话进行简化)并提供您希望获得的预期输出。
请参阅我们的文档以了解 Aspose.Words 文档对象模型:
https://docs.aspose.com/words/python-net/aspose-words-document-object-model/
这将帮助您理解文档在 DOM 中的表示方式。
MS Word 文档中的图像用 SHAPE 节点表示。
PS: 为了得到及时、准确的答复,请务必清楚地描述您的问题,提供您的输入文档、输出文档和预期输出文档,以便更容易理解您的需求。 如果您提供代码,请对其进行简化以使其可运行,以便我们可以在我们这边测试您的场景。
另外,根据我们的免费支持政策,我们有 12 小时的时间提供响应,因此无需淹没论坛。 感谢您的耐心和理解。
Tiaohh
April 16, 2024, 12:21pm
20
def read_table(tables):
_table = []
for row in tables.rows:
_row = ""
for cell in row.as_row().cells:
if _row:
_row = _row + "\t" + cell.as_cell().get_text().strip()
else:
_row = cell.as_cell().get_text().strip()
_table.append(_row)
table_info = "\n".join(_table)
return table_info
for paragraph in doc.get_child_nodes(aw.NodeType.PARAGRAPH, True):
try:
node = paragraph.as_paragraph()
level = 1
if node.get_ancestor(aw.NodeType.TABLE) == None:
if node.paragraph_format.outline_level in [0, 1, 2, 3, 4, 5]:
level = int(node.paragraph_format.outline_level) + 1
if level > current_level:
# 如果级别更深,将当前标题添加到堆栈
stack.append((current_level, data))
data = []
current_level = level
elif level < current_level:
# 如果级别更浅,将堆栈中的项添加回数据
while stack and stack[-1][0] >= level:
old_level, old_data = stack.pop()
data = old_data + data
current_level = old_level
data.append(
{
"Title": node.get_text(),
"Content": [],
"Level": level,
"Table": [],
"Tbale_name": [],
}
)
else:
if data:
if node.get_text().startswith("表"):
if (
"Bullet" in node.paragraph_format.style.name
or "Caption" in node.paragraph_format.style.name
):
data[-1]["Tbale_name"].append(
node.get_text().strip("SEQ 表 \* ARABIC").strip("SEQ")
)
if (
node.get_text().startswith("表")
or node.get_text().startswith("来源:")
or node.get_text().startswith("图")
):
pass
else:
data[-1]["Content"].append(node.get_text())
if node.get_ancestor(aw.NodeType.TABLE) != None:
print(11111)
parent_node = node.get_ancestor(aw.NodeType.TABLE).as_table()
able_content = read_table(parent_node)
print(able_content)
data[-1]["Table"].append(able_content)
except Exception as e:
print(e)
while stack:
old_level, old_data = stack.pop()
data = old_data + data
print(data)
为什么一直循环一个段落的表格信息呢。这样不对呀
Tiaohh
April 16, 2024, 12:51pm
21
就是我一个段落里面可能有多个表格这里需要执行完一个表格内容。执行下一个表格内容。
if node.get_ancestor(aw.NodeType.TABLE) != None:
print(11111)
parent_node = node.get_ancestor(aw.NodeType.TABLE).as_table()
able_content = read_table(parent_node)
print(able_content)
data[-1]["Table"].append(able_content)
@Tiaohh 您发布相同的代码和相同的问题,但没有提供我之前要求的信息。 不幸的是,我无法回答你的问题,因为正如我上面提到的,它还不够清楚。 请再次附上您的输入文档并提供您想要获得的输出。
Tiaohh
April 17, 2024, 1:26am
23
10.docx (55.0 KB)
文档信息,问题出现在循环段落表格信息的时候不对,为什么一直循环一个表格信息,我段落里面有多个表格信息啊
@Tiaohh 请尝试使用以下代码来处理文档:
doc = aw.Document("C:\\Temp\\in.docx")
for s in doc.sections :
sect = s.as_section()
# loop though the direct children of the document body
for node in sect.body.get_child_nodes(aw.NodeType.ANY, False) :
# Check node type.
if node.node_type == aw.NodeType.PARAGRAPH :
para = node.as_paragraph()
if para.paragraph_format.outline_level in [0, 1, 2, 3, 4, 5]:
print("Level: " + str(para.paragraph_format.outline_level) + "\t" + para.to_string(aw.SaveFormat.TEXT))
if node.node_type == aw.NodeType.TABLE :
# here you can process the table.
print("table")
@Tiaohh 表不能位于段落内,因为段落和表都是块级节点,并且位于节点层次结构的同一级别。
Tiaohh
April 17, 2024, 8:10am
28
从word读取表格读取出来的样式怎么看呢 怎么知道是几行几列 有没有合并呢
Tiaohh
April 17, 2024, 9:51am
29
@alexey.noskov 从word读取表格读取出来的样式怎么看呢 怎么知道是几行几列 有没有合并呢