【问题标题】:TypeError: object of type 'lxml.etree._ElementTree' has no len()TypeError:“lxml.etree._ElementTree”类型的对象没有 len()
【发布时间】:2020-09-11 04:06:25
【问题描述】:

我正在尝试删除 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

【问题讨论】:

    标签: python python-3.x beautifulsoup lxml elementtree


    【解决方案1】:

    您的代码示例中 lenonly 情况是: 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')
    

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

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

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

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

    还要注意 lxml 中的以下不一致:

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

    现在你可以调用 len(root)

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2019-05-23
      • 2013-04-18
      • 2015-01-21
      • 2021-12-19
      相关资源
      最近更新 更多