访问 运行 嵌套元素 - Python Docx

Access Run nested elements - Python Docx

这是从word文档

中提取出来的xml
<w:r>
    <w:rPr>
      <w:rtl/>
    </w:rPr>
    <w:fldChar w:fldCharType="begin">
      <w:ffData>
        <w:name w:val="נפתח1"/>
        <w:enabled/>
        <w:calcOnExit w:val="0"/>
        <w:ddList>
          <w:listEntry w:val="A"/>
          <w:listEntry w:val="B"/>
          <w:listEntry w:val="C"/>
          <w:listEntry w:val="D"/>
          <w:listEntry w:val="E"/>
        </w:ddList>
      </w:ffData>
    </w:fldChar>
</w:r>

我正在尝试进入 <w:ddList> 部分,但无法通过 <w:r> 部分

我知道可以通过以下方式获取 运行 元素

run = doc.paragraphs[0].runs[0]

但是 运行s 没有任何类似属性的列表,所以我不知道如何继续,我们将不胜感激。

您要查找的是 run._r,它是代表 <w:r> 元素的 lxml.etree._Element(子类型)对象。

从那里你可以使用 XPath 表达式来得到你想要的东西,比如:

r = run._r
fldChars = r.xpath("./w:fldChar")

.xpath() 调用的 return 值将是与 XPath 表达式匹配的零个或多个对象的列表。

python-docx-实现的元素对象,所谓的 oxml 类型名称如 CT_Run 的对象,有一个更漂亮的 .xpath() 实现,让你不必大惊小怪在名称空间上。 run._r 对象就是其中之一。例如,如果您调用 fldChars[0].xpath(...)fldChart 将是一个“普通”lxml.etree._Element 对象),那么您需要为每个元素提供 Clark-name 样式的名称空间,这充其量是丑陋的。

lxml 文档对此有更多介绍,但如果您可以在 python-docx 元素(如 run._r 上“root”您的 XPath 搜索,那么您可以避免这种情况,使用 like r.xpath("./w:fldChar/w:ffData") 获取那些子元素,而不是从 w:fldChar 元素开始。