首页 > 解决方案 > .next_sibling 返回类型 NoneType

问题描述

我对 Python 很陌生,正在尝试访问标签下一个兄弟的信息。HTML 代码如下所示:

<h4>
    <i>
        <b>"Title"</b>
    </i>
</h4>
<i>"Description"</i>

我正在运行一个for循环,该循环遍历每个h4标签并找到所有兄弟姐妹,直到到达新的h4标签。在这两个h4标签之间可以有多个兄弟姐妹。当我运行我的代码时:

title = course.find_all('h4')[x]
array = []
sibling = title
while True:
    sibling = sibling.next_sibling
    try:
        siblingType = sibling.name
    except AttributeError:
        siblingType = ''
    if siblingType != 'h4':
        array.append(sibling.text)
    else:
        break

程序返回兄弟类型变量是' NoneType '并且兄弟是空的,它显然应该是类型i

我在这里做错了什么?

标签: pythonbeautifulsoup

解决方案


您可以忽略“h4”和“I”之间的换行符。这样的节点具有类型NavigableString

另一种方法是搜索下一个非空类型节点,Tag如果遇到另一个“h4”则中断循环:

array = []
sibling = title.next_sibling

while True:
    while sibling and not isinstance(sibling, bs4.element.Tag):
        sibling = sibling.next_sibling
    if sibling is None or sibling.name == "h4":
        break
    array.append(sibling.get_text())
    sibling = sibling.next_sibling

print(array)

你得到:

['"Description"']

此解决方案也适用于以下情况:

<h4>
<i>
<b>"Title"</b>
</i>
</h4>
<i>"Description"</i>
<i>"Description2"</i>
<h4>
<i>
<b>"Title2"</b>
</i>
</h4>

你得到:

['"Description"', '"Description2"']

推荐阅读