【问题标题】:XPath for w:p without certain ancestor elements?没有某些祖先元素的 w:p 的 XPath?
【发布时间】:2021-04-18 03:51:35
【问题描述】:

我一直在关注使用 .//x[not(ancestor::w:tbl)] 形式的 XPath not ancestor 选择器的示例,但它的行为与我预期的不同。

我正在解析一个包含表格的 Word DOCX 文件。我正在使用 python lxml 库将其解析为 XML。我想获取在其祖先树中的任何位置都没有表格元素的段落项目。

我在控制台中输入以下内容:

selector = './/w:p[not(ancestor::w:drawing)][not(ancestor::w:tbl)][not(ancestor::v:textbox)][not(ancestor::wps:wsp)][not(ancestor::mc:Fallback)]
nsDict = {k:v for k,v in doc.nsmap.items() if k}
paragraphs = doc.xpath(selector,namespaces=nsDict)
for p in paragraphs:
    print(bool(p.xpath(".//ancestor::w:tbl",namespaces=nsDict)))
>>>>False
>>>>False
>>>>False
>>>>False
>>>>False
>>>>False
>>>>True
>>>>False

预期的行为是段落 xpath 选择器与父文档元素级 xpath 选择器互斥。段落布尔检查应始终为False

如何修改我的初始选择器,以便不选取以 w:tbl 为祖先的元素?

【问题讨论】:

    标签: python xml xpath lxml openxml


    【解决方案1】:

    您的初始 XPath 没问题;是您的测试 XPath 有问题。

    您的测试 XPath,

    .//ancestor::w:tbl
    

    在当前节点选择w:tbl祖先;它选择当前节点的任何后代的w:tbl 祖先。

    例如,如果一个段落没有作为表的祖先,但有​​一个包含段落的后代表,则会为您的测试产生True

    改为

    ancestor::w:tbl
    

    选择当前节点的w:tbl祖先。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2019-06-22
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多