.next_sibling返回类型NoneType

时间:2018-09-08 12:19:53

标签: python beautifulsoup

我对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

程序返回 siblingType 变量为'NoneType',并且兄弟姐妹为空,显然它应为 i 类型。

我在这里怎么可能做错了?

1 个答案:

答案 0 :(得分:0)

您可以忽略“ 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"']