Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 18, 2018 13:40:24

Sterh
Зарегистрирован: 2018-06-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

BeautifulSoup как разделить текст по произвольному тэгу?

Здравствуйте!
В питоне и BS новичек. Долго гуглил, но не нашел, как решить проблему (может не в ту сторону гуглил)

Задача:
Разбить текст посредством BS по произвольному тэгу. Например в коде страницы есть такой кусок:

 <option value="6">Ассам</option><option value="7">Кения</option><option value="8">Руанда</option><option value="9">Цейлон</option>

Между словами пробелов, или переводов строк нет. В результате разбора текста посредством кода:
 resp = BeautifulSoup(open(p, encoding='utf-8'))
resp.body.text

Получаю склеенные слова:
“АссамКенияРуандаЦейлонПрефектура”

Вопрос: Как разлеплять подобные вещи, при условии, что:
1) Вместо “option” тэг может быть абсолютно любой (на что хватает фантазии вэбмастера), и каждый раз вычислять что это за тэг не вариант вообще
2) Разделять по заглавным буквам так же не вариант, ибо далеко не факт, что на другой странице слепленные слова будут написаны тоже с заглавных

Офлайн

#2 Июнь 18, 2018 15:05:23

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

BeautifulSoup как разделить текст по произвольному тэгу?

Доки на русском. Смотреть в сторону children, выбираем родителя, пробегаем по деткам и пакуем нужным образом. Все просто)

Отредактировано Vladimirv (Июнь 18, 2018 15:06:07)

Офлайн

#3 Июнь 18, 2018 18:23:53

Sterh
Зарегистрирован: 2018-06-18
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

BeautifulSoup как разделить текст по произвольному тэгу?

Vladimirv
Благодарю за ответ!
Однако я, наверное, не совсем корректно сформулировал задачу. Мне нужно было, что бы НЕ склеивались слова, вне зависимости от того, внутри каких тэгов они расположены. Нужен некий универсальный способ, применимый к любой произвольной вэб-странице. Т.е. искать родителей тоже не вариант.
Пока нашел вот такой вариан:

 resp = BeautifulSoup(open(p, encoding='utf-8'))
clean_text = ' '.join(resp.body.findAll(text=True))

Вроде работает (слова расклеены), но при этом в текст тянется часть тэгов…. Вот вроде такого:

 Вход для клиентов Добрый день <span id="user_email"></span> Личный кабинет Выйти Регистрация
Ап:
А, тэги, которые тянет, закомментированы:

 </span><!-- <span id="user_email"></span>-->
… ковыряем дальше

Ап2:
Если дебил, то это лечится с трудом Удаляем комментарии:
 for comment in resp.findAll(text=lambda text: isinstance(text, bs4.Comment)):
    comment.extract()

Полностью получается так:
 resp = BeautifulSoup(open(p, encoding='utf-8'))
# Удаляем все noindex
for i in resp.findAll('noindex'):
    resp.noindex.decompose()
# Удаляем скрипты
for i in resp.findAll('script'):
    resp.script.decompose()
#Удаляем закооментированные строки
for comment in resp.findAll(text=lambda text: isinstance(text, bs4.Comment)):
    comment.extract()
#Получаем строку текста
clean_text = ' '.join(resp.body.findAll(text=True))

Мож кому пригодится Решение взято тут: http://tinycode.ru/how-to-clean-html-and-strip-tags.html

Отредактировано Sterh (Июнь 18, 2018 18:38:46)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version