首页 > 解决方案 > 如何使用 NoParent BeautifulSoup 打印元素编号和元素内容?

问题描述

我正在尝试识别 NoneType 且没有父元素的元素(段落/元素编号及其内容),但尚未成功。

这是我的示例input.html文件,其中触发错误的段落是第二个表中的第三个。

以下是我当前的代码和我得到的错误:

fp = open("input.html", "rb")
soup = BeautifulSoup(fp, "html5lib")

i=0
NoneType = type(None)
for elem in soup.find_all('font'):
    i=i+1
    target = elem.findParent().findParent()
    target.decompose()
    if target is NoneType:
        print(i)

Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'NoneType' object has no attribute 'findParent'
>>>

如果我删除该行target.decompose(),则不会出现错误,因此问题似乎出在此命令上。但即使我删除该行target.decompose()并尝试使用 打印元素编号print(i),它也不会打印任何内容。

我能做些什么来识别没有父母的元素?

标签: pythonbeautifulsoup

解决方案


您的for循环运行了 3 次(因为soup.find_all('font')选择了 3font个节点)。每个循环都会清除当前节点decompose的祖父母。font

在第一个循环中,当前font节点的祖父母是<p align="left">; 消除该decompose节点(包括第一个font节点),留下两个剩余的font节点。

第二个(现在是第一个)font节点的祖父母是<TR>不像 <p align="left">第一个节点那样,因为第一个节点<b>在它自己和之间有一个<p align="left">;这个当前font节点是该节点的直接子节点,<p align="left">并且该节点的父节点是<TR>)。该<TR>节点在其自身中包含两个剩余节点作为孙子font节点,因此当前decompose同时消除了这两个节点。

到执行第三个循环时,soup不再有任何font节点,因此没有elemfor 该循环;因此,也没有祖父母。


推荐阅读