Читаем истории с помощью Python

Сегодня снова будем читать прохладные истории Николая Хлевицкого, только теперь не просто так, а через Python. Когда я устраивался в Тензор, у меня было аналогичное тестовое задание. Есть сайт площадки с закупками, надо вытащить оттуда информацию, обработать и положить в базу. Можно в несколько потоков. Я сам тогда на Python ничего не делал и не пробовал, но за пару вечеров более-менее разобрался и что-то написал.

С этим меня взяли на работу, свой скрипт я потом допилил, чтобы он правильно работал с базой. После этого он ещё года два крутился на боевом сервере вместе с остальными загрузчиками. На самом деле, это решение было довольно простым и «в лоб», но оно работало, было быстро написано и позволило сделать первую версию нашего продукта и начать его продавать. После этого были попытки сделать полноценную систему загрузки, на платформе СБИС, с мониторингом и прочими плюшками. Но это получилось только с третьего раза, когда этим стал заниматься целый отдел в Екатеринбурге. И потребовалось на это почти три года. Если бы мы сразу стали делать подобную систему, то не смогли бы и из беты выйти. Так что простые решения, особенно на старте часто бывают полезными.

Но вернёмся к историям. Задача: есть рассказ, доступный по ссылке. Нужно более-менее прилично вывести его текст. Вот мой вариант. Если вы не знаете Python, то попробуйте разобраться, а если знаете, скажите, как сделать лучше 🙂

from urllib.request import *
import bs4

indent = 60
line_len = 80

def main():
    link = 'http://coolstorys.ru/polnaya-versiya/deti-deti2'
    opener = FancyURLopener({})
    response = opener.open(link)
    content = response.read()
    content = content.decode('utf-8')

    a = bs4.BeautifulSoup(content, 'lxml')
    article = a.find('div', {'class': 'tm-article-content '})
    for line in article.text.split('\n'):
        words = line.split(' ')
        to_print = ' '*indent
        while len(words) > 0:
            to_print += words[0] + ' '
            words = words[1:]
            if len(to_print) > indent + line_len:
                print(to_print)
                to_print = ' '*indent
        print(to_print)

if __name__ == '__main__':
    main()

Пара комментариев. Я использую FancyURLopener для того, чтобы обрабатывать корпоративный шлюз. Если делать прямые запросы через urllib.request, то их шлюз будет их останавливать. В FancyURLopener есть дополнительная обработка таких ошибок. Для разбора HTML-кода используется BeautifulSoup. С ним удобно искать тэги, а потом брать их текст или атрибуты. Раньше, когда я о нём не знал, с html я работал как со строкой: ищешь тэг по имени, где он открывается, где закрывается, что между ними. Это очень геморройно и неправильно, лучше BeautifulSoup.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *