-
Notifications
You must be signed in to change notification settings - Fork 15
Description
Ссылка на функцию get_anecdote:
...
receive = requests.get('http://anekdotme.ru/random') # отправляем запрос к странице
page = BeautifulSoup(receive.text, "html.parser") # подключаем html парсер, получаем текст страницы
find = page.select('.anekdot_text') # из страницы html получаем class="anekdot_text"
for text in find:
page = (text.getText().strip()) # из class="anekdot_text" получаем текс и убираем пробелы по сторонам
Предлагаю использовать мой вариант:
def get_anekdot() -> str:
rs = requests.get('http://anekdotme.ru/random')
root = BeautifulSoup(rs.content, "html.parser")
el = root.select_one('.anekdot_text')
return el.get_text(strip=True, separator='\n')
Ниже объясню в чем я вижу минусы вашего парсера:
-
Поле
receive.textвозвращает строку в кодировке, которая определяется по байтовой строке ответа, а именно черезchardet.detect. Я думаю, что лучше в парсер передавать байтовую строку (.content), что бы тот сам определил кодировку. Например, в HTML в<head>можно указывать кодировку и парсер вполне может на нее смотреть. -
Если планировалось возвращать один анекдот, то лучше использовать
select_one, кроме того, вариант с циклом делает лишние итерации -- всегда возвращается последний анекдот из списка элементов.anekdot_text, т.е. тут лишние переборы в цикле. -
Выражение
.getText().strip()имеет более питоничий вариант:.get_text(strip=True)
Я бы еще к get_text добавил атрибут separator='\n'. Его назначение в добавлении разделителя между тегами при получении из них текста.
Для наглядности вывел текст из одного и того же элемента.
Вариант с separator='\n':
Отец читает сказку сыну на ночь:
— Ехали медведи, на велосипеде, а за ними кот — задом наперед, а за ним комарики, на воздушном шарике.
— Пап, скажи честно, че ты куришь?
Без:
Отец читает сказку сыну на ночь:— Ехали медведи, на велосипеде, а за ними кот — задом наперед, а за ним комарики, на воздушном шарике.— Пап, скажи честно, че ты куришь?
PS.
Ваша статья мне понравилась. Я искал в гугле примеры с ConversationHandler и на нее, собственно, наткнулся :)