代码之家  ›  专栏  ›  技术社区  ›  Mad Physicist

如何检测python docx中的空段落

  •  1
  • Mad Physicist  · 技术社区  · 7 年前

    给出一份包含段落的文件

    d = docx.Document()
    p = d.add_paragraph()
    

    我希望每次都能使用以下技术:

    if len(p._element) == 0:
        # p is empty
    

    if len(p._p) == 0:
        # p is empty
    

    (旁白,有什么区别?看来 p._p is p._element 我在野外见过的每一次。)

    如果我在段落中添加样式,则该复选框将不再有效:

    >>> p2 = d.add_paragraph(style="Normal")
    >>> print(len(p2._element))
    1
    

    显式设置 text=None 也没什么帮助,不是我所期望的。

    那么,如何检查一个段落是否没有内容(特别是文本和图像,尽管更一般更好)?

    更新

    我有点搞砸了,发现设置样式显然增加了一个 pPr 元素:

    >>> p2._element.getchildren()
    [<CT_PPr '<w:pPr>' at 0x7fc9a2b64548>]
    

    元素本身为空:

    >>> len(p2._element.getchildren()[0])
    0
    

    def isempty(par):
        return sum(len(run) for run in par._element.xpath('w:r')) == 0
    

    def isempty(par):
        p = par._p
        runs = p.xpath('./w:r[./*[not(self::w:rPr)]]')
        others = p.xpath('./*[not(self::w:pPr) and not(self::w:r)] and '
                         'not(contains(local-name(), "bookmark"))')
        return len(runs) + len(others) == 0
    

    w:pPr w:rPr

    1 回复  |  直到 7 年前
        1
  •  4
  •   scanny    7 年前

    这个 <w:p> 元素可以包含大量子元素中的任何一个子元素,如您在下面的XML模式摘要中所看到的: http://python-docx.readthedocs.io/en/latest/dev/analysis/schema/ct_p.html (参见CT_p和EG_p内容定义)。

    特别是,它经常有一个 w:pPr child,这是样式设置的位置。

    所以你的测试对于误报不是很可靠(如果是空的就被认为是阳性的)。

    我倾向于使用 paragraph.text == '' ,通过运行分析。

    一个运行可以是空的(文本),所以仅仅存在一个运行是不够的证明。实际文本保存在 a:t (文本)元素,也可以为空。所以 .text 这种方法避免了所有这些低级复杂的问题,并且有很多好处,成为API的一部分,在将来的版本中更不可能发生更改。