BeautifulSoup получить текст между элементами - PullRequest
0 голосов
/ 04 октября 2019

У меня есть что-то вроде этого:

<b>foo:</b> bar

<br />


<b>baz:</b>
<font color="green">YES</font> spam

<br />


<b>eggs:</b> ham

<br />

Теперь я хочу получить все эти строки между <br> с.

Я могу сделать что-то вроде этого:

from bs4 import BeautifulSoup
# get the html here
soup = BeautifulSoup(content, 'html.parser')
for element in soup.find_all('b'):
    print(element.next_sibling)

И это работает, но только для не инкапсулированного текста, т.е. в тегах <font>. Таким образом, я получу bar и ham, но я не получу YES и неожиданно для себя даже не получу spam. Есть ли способ разобрать это без использования регулярных выражений?

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Я попробовал. Надеюсь, что это работает


# get the html here
soup = BeautifulSoup(content, 'html.parser')
all_b=soup.find_all('b')
for b in all_b:
    print(b.get_text())
    next_b=b.findNext('b')
    #print(next_b)
    for sibling in b.next_siblings:
        if(sibling!=next_b):
            if(sibling!=None and isinstance(sibling,str)==False):
                print(sibling.get_text())
                sibling=sibling.next_sibling
            elif(sibling!=None and isinstance(sibling,str)==True):
                print(sibling)
                sibling=sibling.next_sibling
        elif(sibling==next_b):
            break
    print("new")

enter image description here

0 голосов
/ 04 октября 2019

Вы можете использовать find_all () и проверить все теги, а затем найти тег на основе этого. Используйте next_element для получения значения.

from bs4 import BeautifulSoup
html='''<b>foo:</b> bar

<br />


<b>baz:</b>
<font color="green">YES</font> spam

<br />


<b>eggs:</b> ham

<br />'''
soup=BeautifulSoup(html,'lxml')
for item in soup.find_all():
    if item.name=='font':
       print(item.text.strip())
       print(item.next_element.next_element.strip())
    if item.name=='b':
       if item.next_element.next_element.strip()!='':
           print(item.next_element.next_element.strip())

Вывод :

bar
YES
spam
ham
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...