Skip to content

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

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 и на нее, собственно, наткнулся :)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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