我有一个doc,其目录是在doc开头自动生成的,并且想要解析这个目录。这可以使用 python-docx 吗?如果我尝试遍历doc.paragraphs.text
,则内容列表中的文本不会显示。
我尝试了以下内容:迭代段落并检查paragraph.style.name
是否toc 1
然后我知道我在ToC中。但我无法得到实际的文字。我试过这个:
if para.style.name == "toc 1" #then print para.text.
但是para.text
给了我一个空白字符串。为什么会这样呢?
由于
答案 0 :(得分:2)
我相信你会发现TOC的实际生成内容被包裹了#34;在非段落元素中。 python-docx
无法直接找到您,因为它只会找到w:document/w:body
元素的直接子项的段落。
为了实现这些目标,你需要使用python-docx来达到lxml级别,以尽可能接近你。您可以使用以下方法访问(并打印)body元素:
document = Document('my-doc.docx')
body_element = document._body._body
print(body_element.xml) # this will be big if your document is
从那里,您可以识别所需部件的特定XML位置,并使用lxml / XPath来访问它们。然后,您可以将它们包装在python-docx Paragraph
对象中以便于访问:
from docx.text.paragraph import Paragraph
ps = body_element.xpath('./w:something/w:something_child/w:p'
paragraphs = [Paragraph(p, None) for p in ps]
这不是一个确切的方法,需要你做一些研究才能弄清w:something
等等,但是如果你想要克服这些障碍,那么这种方法就可以了。
一旦你开始工作,发布你的确切解决方案可能会对搜索其他人有所帮助。
答案 1 :(得分:0)
由于大多数解决方案都隐藏在注释部分中,并且花了我一段时间才能弄清楚OP的工作方式以及scanny的回答如何改变了他的工作,所以我将解决方案发布在这里,这仅仅是斯堪尼的答案的评论部分写了什么。我不完全了解代码的工作原理,因此,如果有人想编辑我的答案,请随时进行编辑。
#open docx file with python-docx
document = docx.Document("path\to\file.docx")
#extract body elements
body_elements = document._body._body
#extract those wrapped in <w:r> tag
rs = body_elements.xpath('.//w:r')
#check if style is hyperlink (toc)
table_of_content = [r.text for r in rs if r.style == "Hyperlink"]
table_of_content将是一个列表,由首先作为项目的编号,然后是标题组成。