.next_sibling возвращает тип NoneType - PullRequest
0 голосов
/ 08 сентября 2018

Я довольно новичок в Python и пытаюсь получить информацию о следующем родственнике тега. HTML-код выглядит примерно так:

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

Я запускаю цикл для , который проходит через каждый тег 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 голосов
/ 08 сентября 2018

Вы можете игнорировать перевод строки между «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"']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...