Можно ли получить следующую информацию от BeautifulSoup без петли или дополнительного модуля? - PullRequest
0 голосов
/ 19 февраля 2019

Я использую BeautifulSoup4 и Python 3.

Я пытаюсь очистить часть веб-страницы, которая имеет следующую структуру:

<h1>Main Title Here<br/>

<small>
Subtitle Here - 
More Pieces of Subtitle Here</small>
</h1>

До сих пор я пытался:

  • Печать текста для всего элемента print(soup.find('h1').text) - Это печатает с лишними пробелами, затрудняя манипулирование.
  • Получение содержимого для элемента - похоже, это дает те же результаты, что и текст

Итак, с обоими методами выше мой вывод выглядит так:

Основное название здесь здесь несколько пробелов здесь несколько пробелов Здесь субтитры - здесь несколько пробелов здесь несколько пробелов Подробнее здесь субтитры

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

  • Использование Replace () и Strip ()
    - Это немного очищает, однако, полоса удаляет только самые внешние пробелы иЗамена может удалить все пробелы (которые я не хочу)
  • Используя Decompose () и Extract ()
    - Это удаляет все из тега "small" и возвращает теги <none>.

Я бы хотел, чтобы вывод выглядел следующим образом:
(строка 1) Основное название здесь
(строка 2) Здесь субтитры - больше субтитров здесь

Или это также будет работать:
(1 строка) Основное название здесь, субтитры здесь - больше фрагментов субтитров

По сути, мне нужно, чтобы это было сжато до одной или двух строк без лишних пробелов и всего HTMLтеги удалены.

Из того, что я читал здесь в другом месте, мне нужно либо использовать цикл for для итерации по этому маленькому фрагменту страницы (что также потребовало бы замены «Find» на «FindAll» на мойзнания, или мне нужно импортироватьt re модуль.

Есть ли способ достичь желаемого результата без использования цикла или импорта модуля?

Вот некоторые другие вещи, которые я пробовал (без особого успеха или безуспешно):

#Grabbing element, then next element separately
    print(soup.findAll('h1')[0].next)
    h=(soup.findAll('small')[0].next)
    h=h.replace('\n', '')
    print(h.strip())

#Grabbing by div and looping through
    i = soup.find('div', attrs={'page-header'})
    children = i.findChildren()
    for child in children:
         print(child)

1 Ответ

0 голосов
/ 19 февраля 2019

Я полагаю, что вы полагаетесь на теги в заголовке, а не на разрывы строк:

h1 = soup.find('h1')
list(h1.strings)[0] # The first string of the header
#'Main Title Here'
h1.find('small').string.strip() # The string in <small>
#'Subtitle Here - \nMore Pieces of Subtitle Here'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...