Я использую BeautifulSoup 4 с Python для анализа HTML-кода. Вот код:

from bs4 import BeautifulSoup as bs
html_doc = '<p class="line-spacing-double" align="center">IN <i>THE </i><b>DISTRICT</b> COURT OF {county} COUNTY\nSTATE OF OKLAHOMA</p>'

soup = bs(html_doc, 'html.parser')
para = soup.p

for child in soup.p.children:
    print (child)

Результат:

IN
<i>THE </i>
<b>DISTRICT</b>
 COURT OF {county} COUNTY
STATE OF OKLAHOMA

Это все имеет смысл. Я пытаюсь перебрать результаты, и если я найду <i> или <b>, сделаю с ними что-то другое. Когда я пробую следующее, это не работает:

for child in soup.p.children:
    if child.findChildren('i'):
        print('italics found')

Ошибка в том, что первый возвращенный дочерний элемент является строкой, и я пытаюсь найти в нем дочерний тег, а BS4 уже знает, что дочерних элементов нет.

Поэтому я изменил код, чтобы проверить, является ли дочерний элемент строкой, и если это так, не пытайтесь предпринимать какие-либо действия с ним, просто распечатайте его.

for child in soup.p.children:
    if isinstance(child, str):
        print(child)
    elif child.findAll('i'):
        for tag in child.findAll('i'):
            print(tag)

Результат этого последнего кода:

IN
 COURT OF {county} COUNTY
STATE OF OKLAHOMA

Когда я перебираю результаты, мне нужно иметь возможность проверять теги в результате, но я не могу понять, как это сделать. Я думал, что это должно быть просто, но я в тупике.

РЕДАКТИРОВАТЬ:

В ответ на jacalvo:

Если я бегу

for child in soup.p.children:
    if child.find('i'):
        print(child)

По-прежнему не удается распечатать 2-ю и 3-ю строки из HTML-кода

Редактировать:

for child in soup.p.children:
    if isinstance(child, str):
        print(child)
    else:
        print(child.findChildren('i', recursive=False))

Это привело к:

IN
[]
[]
 COURT OF {county} COUNTY
STATE OF OKLAHOMA
1
j_allen_morris 29 Июн 2019 в 21:28

3 ответа

Лучший ответ

Это пример того, что вы пытаетесь сделать как пример "сделать что-то другое" с тегами? Наличие образца полного желаемого результата в вопросе поможет:

from bs4 import BeautifulSoup as bs

html_doc = '<p class="line-spacing-double" align="center">IN <i>THE</i> <b>DISTRICT</b> COURT OF {county} COUNTY\nSTATE OF OKLAHOMA</p>'
soup = bs(html_doc, 'html.parser')
para = soup.p

for child in para.children:
    if child.name == 'i':
        print(f'*{child.text}*',end='')
    elif child.name == 'b':
        print(f'**{child.text}**',end='')
    else:
        print(child,end='')

Выход:

IN *THE* **DISTRICT** COURT OF {county} COUNTY
STATE OF OKLAHOMA
1
Mark Tolonen 29 Июн 2019 в 20:03
    from bs4 import BeautifulSoup as bs

    html_doc = '<p class="line-spacing-double" align="center">IN <i>THE </i><b>DISTRICT</b> COURT OF {county} ' \
               'COUNTY\nSTATE OF OKLAHOMA</p> '

    soup = bs(html_doc, 'html.parser')
    paragraph = soup.p

    # all tags dynamically gotten
    tags = [tag.name for tag in soup.find_all()]

    for child in paragraph.children:
        if child.name in tags:
            print('{0}'.format(child))  # or child.text
        else:
            print(child)

Выход

    IN 
    <i>THE </i>
    <b>DISTRICT</b>
     COURT OF {county} COUNTY
    STATE OF OKLAHOMA
0
jonathan 29 Июн 2019 в 20:28

Используйте findChildren (), а затем проверьте имя ребенка с условиями if.

from bs4 import BeautifulSoup as bs
html_doc = '<p class="line-spacing-double" align="center">IN <i>THE </i><b>DISTRICT</b> COURT OF {county} COUNTY\nSTATE OF OKLAHOMA</p>'

soup = bs(html_doc, 'html.parser')

for child in soup.find('p').findChildren(recursive=False) :
    if child.name=='i':
        print(child)
    if child.name=='b':
        print(child)

Выход:

<i>THE </i>
<b>DISTRICT</b>
0
KunduK 29 Июн 2019 в 19:29