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).
我试图删除 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).