TypeError: object of type 'lxml.etree._ElementTree' has no len()

TypeError: object of type 'lxml.etree._ElementTree' has no len()

我试图删除 Python 函数返回的 XML 文件中的一些空 text 标签,但我收到此错误:TypeError: object of type 'lxml.etree._ElementTree' has no len()。为什么?

这是函数:

def due(pdfpath):

ntree = uniform_cm(pdfpath)
etree.strip_tags(ntree, 'textline')

# Search for all text "textbox" elements
for textbox in ntree.xpath('//textbox'):
    new_line = etree.Element("new_line")
    previous_bb = None

    # From a given textbox element, iterate over all the "text" elements
    for x in textbox.iter("text"):
        # Get current bb valu
        bb = getBBoxFirstValue(x)
        # Check current and past values aren't empty
        if bb is not None and previous_bb is not None and (bb - previous_bb) > 20:
            # Inserte newline into parent tag
            x.getparent().insert(x.getparent().index(x), new_line)

            # A new "new_line" element is created
            new_line = etree.Element("new_line")

        # Append current element is new_line tag
        new_line.append(x)

        # Keep latest non empty BBox 1st value
        if bb is not None:
            previous_bb = bb

    # Add last new_line element if not null
    textbox.append(new_line)
tree = ntree


soup = BeautifulSoup(tree, "lxml")

for x in soup.find_all():
    if len(x.get_text(strip=True)) == 0:
        x.extract()


return tree

您的代码示例中 len 情况是: if len(x.get_text(strip=True)) == 0:

但是我检查了 type(x) 得到了 bs4.element.Tag, 而在您的错误消息中是 'lxml.etree._ElementTree' has no len().

显然你的错误发生在某些其他地方。

对未来的建议:当你寻找异常的原因时, 说明精确地它发生在哪一行。 StackTrace 包含有关此事的指示。

所以我进行了一些与您无关的调查 代码示例。

当您使用 lxml 解析 XML 文件时,例如:

from lxml import etree as et
tree = et.parse('Input.xml')

(整个XML文档)的类型只是lxml.etree._ElementTree.

当您现在尝试 运行:len(tree) 您将得到:

TypeError: object of type 'lxml.etree._ElementTree' has no len()

但是当您从这棵树中读取 root 元素时:root = tree.getroot()root 的类型是 lxml.etree._Element(注意现在你有 一个 Element 而不是整个文档)你可以 运行 len(root), 获取其(直接)children 的编号。对任何其他人都一样 XML 树的元素。

另请注意 lxml 中的以下不一致之处:

当您从 字符串 中读取 XML 内容时,即:root = et.XML(some_text_variable) 结果是 根元素,而不是文档树。

现在你可以调用 len(root).