Skip to content

Рефакторинг парсера в функции get_anecdote #1

@gil9red

Description

@gil9red

Ссылка на функцию 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')

Ниже объясню в чем я вижу минусы вашего парсера:

  1. Поле receive.text возвращает строку в кодировке, которая определяется по байтовой строке ответа, а именно через chardet.detect. Я думаю, что лучше в парсер передавать байтовую строку (.content), что бы тот сам определил кодировку. Например, в HTML в <head> можно указывать кодировку и парсер вполне может на нее смотреть.

  2. Если планировалось возвращать один анекдот, то лучше использовать select_one, кроме того, вариант с циклом делает лишние итерации -- всегда возвращается последний анекдот из списка элементов .anekdot_text, т.е. тут лишние переборы в цикле.

  3. Выражение .getText().strip() имеет более питоничий вариант: .get_text(strip=True)


Я бы еще к get_text добавил атрибут separator='\n'. Его назначение в добавлении разделителя между тегами при получении из них текста.

Для наглядности вывел текст из одного и того же элемента.

Вариант с separator='\n':

Отец читает сказку сыну на ночь:
— Ехали медведи, на велосипеде, а за ними кот — задом наперед, а за ним комарики, на воздушном шарике.
— Пап, скажи честно, че ты куришь?

Без:

Отец читает сказку сыну на ночь:— Ехали медведи, на велосипеде, а за ними кот — задом наперед, а за ним комарики, на воздушном шарике.— Пап, скажи честно, че ты куришь?


PS.

Ваша статья мне понравилась. Я искал в гугле примеры с ConversationHandler и на нее, собственно, наткнулся :)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions