Сегодня снова будем читать прохладные истории Николая Хлевицкого, только теперь не просто так, а через Python. Когда я устраивался в Тензор, у меня было аналогичное тестовое задание. Есть сайт площадки с закупками, надо вытащить оттуда информацию, обработать и положить в базу. Можно в несколько потоков. Я сам тогда на Python ничего не делал и не пробовал, но за пару вечеров более-менее разобрался и что-то написал.
С этим меня взяли на работу, свой скрипт я потом допилил, чтобы он правильно работал с базой. После этого он ещё года два крутился на боевом сервере вместе с остальными загрузчиками. На самом деле, это решение было довольно простым и «в лоб», но оно работало, было быстро написано и позволило сделать первую версию нашего продукта и начать его продавать. После этого были попытки сделать полноценную систему загрузки, на платформе СБИС, с мониторингом и прочими плюшками. Но это получилось только с третьего раза, когда этим стал заниматься целый отдел в Екатеринбурге. И потребовалось на это почти три года. Если бы мы сразу стали делать подобную систему, то не смогли бы и из беты выйти. Так что простые решения, особенно на старте часто бывают полезными.
Но вернёмся к историям. Задача: есть рассказ, доступный по ссылке. Нужно более-менее прилично вывести его текст. Вот мой вариант. Если вы не знаете Python, то попробуйте разобраться, а если знаете, скажите, как сделать лучше 🙂
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.