Сворачивание дочерних элементов с помощью Beautifulsoup

#python #beautifulsoup #nlp

#python #beautifulsoup #nlp

Вопрос:

Я хотел бы проанализировать HTML-документ и игнорировать элементы span (но сохранить их содержимое), чтобы я мог повторять строки в документе так, как их видит пользователь, в отличие от того, как их видит анализатор HTML. Я пробовал разворачивать и не получил ожидаемого результата — вот пример того, что я пытаюсь сделать:

 html = "<p>text <span>more text</span> additional text</p>"
soup = BeautifulSoup(html,'html.parser')
for match in soup.findAll('span'):
    match.unwrap()
for string in soup.strings:
    print(string)
 

Предполагаемый результат:

 text more text additional text
 

Результат, который я получаю:

 text
more text
additional text
 

Как я могу игнорировать теги span, чтобы при выполнении итерации с использованием html.strings итератор вел себя так, как будто никогда не было промежутков?

Ответ №1:

Вы можете использовать разные подходы:

A: соедините ваши span тексты в строку:

 ''.join([string for string in soup.strings])
 

B: просто используйте .text в p теге:

 for match in soup.find_all('p'):
    print(match.text)
 

Примеры:

 from bs4 import BeautifulSoup
html = "<p>text <span>more text</span> additional text</p>"
soup = BeautifulSoup(html,'html.parser')
for match in soup.findAll('span'):
    match.unwrap()
print(''.join([string for string in soup.strings]))
    
for match in soup.find_all('p'):
    print(match.text)
 

Выводит

 text more text additional text
text more text additional text