python - 如何使用 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)
,它也不会打印任何内容。
我能做些什么来识别没有父母的元素?
解决方案
您的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
节点,因此没有elem
for 该循环;因此,也没有祖父母。
推荐阅读
- boolean - 'loginpage.Type' 不能转换为 '(Binding
) -> 登录页面' - javascript - 分解 JS 函数
- php - 我如何解决这个问题 在布尔值上调用成员函数 fetchAll()?
- javascript - Redux 将值分配给已经有来自另一个 reducer 的值的对象
- python - 如何在 django 中添加另一个模型的模型对象时自动创建一个模型的模型对象
- php - Laravel:使用正则表达式进行公司验证
- javascript - 谷歌电子表格中的 Javascript
- python - Matplotlib 在同一轴上的不同精度(比例)
- java - 使用递归方法来确定一个词是否精灵
- javascript - 计算 JavaScript 测验的分数