Уроки Python 14 // Программа, читающая новости вслух
Сегодня мы напишем программу которая будет парсить заголовки новостей и читать их вслух голосом робота.
Для парсинга мы применим уже известную из прошлого урока библиотеку Beautiful Soup. Её задачей будет получить массив из текстовых заголовков новостей.
Чтобы прочитать вслух полученные заголовки, мы используем модуль Google Text To Speech (gTTS), который через онлайн сервис преобразовывает текстовые строки в mp3 файлы. Чтобы проигрывать полученные mp3 применим модуль pygame, а точнее его подмодуль mixer.
Для начала установим нужные нам модули, дав в командной строке команды:
pip install wheel
pip install gTTS
pip install pygame
Заголовки новостей будем парсить отсюда:
https://m.news.yandex.ru/world.html
Откроем исходный код данной веб страницы и обнаружим, что заголовки лежат в ссылках с родительским классом story__title.
Значит селектор для получения ссылок будет состоять из класса 'story__title' и тега 'a' который обозначает ссылку. Селектор получится таким '.story__title a'
Обратите внимание что ссылок много, и селектор вернет нам не одну переменную а целый список ссылок. Нам лишь останется по очереди получать текст этих ссылок командой getText() и читать его вслух с помощью gTTS.
Как распарсить заголовки новостей разобрались, теперь разберемся с чтением вслух. Во первых нам нужно создать временный mp3 файл, на который мы будем переадресовывать нашу программу после прочтения очередногой новости. Это нужно для того чтобы избежать ошибок с перезаписью файла.
Инициализируем проигрыватель mp3 командой
mixer.init()
Теперь получим тот самый временный mp3 файл, отправив гуглу слово 'пусто' и сохранив ответ как '0.mp3'
tts=gTTS(text='пусто', lang='ru')
tts.save('0.mp3')
Получим в переменную p массив ссылок парсером:
s=requests.get('https://m.news.yandex.ru/world.html')
b=bs4.BeautifulSoup(s.text, "html.parser")
p=b.select('.story__title a')
Ну а теперь, когда у нас есть массив ссылок на заголовки новостей, будем циклично читать их с помощью gTTS, каждый раз сохраняя mp3 в '1.mp3', а после прочтения переадресовывая на временный файл '0.mp3'. Во время чтения будет прерывать работу программы командой:
while mixer.music.get_busy():
time.sleep(0.1)
Эта команда использует модуль time чтобы создать паузу в работе программы. Вся программа будет выглядеть так:
import requests, bs4, time
from pygame import mixer
from gtts import gTTS
mixer.init()
tts=gTTS(text='пусто', lang='ru')
tts.save('0.mp3')
s=requests.get('https://m.news.yandex.ru/world.html')
b=bs4.BeautifulSoup(s.text, "html.parser")
p=b.select('.story__title a')
for x in p:
print(x.getText())
tts=gTTS(text=x.getText(), lang='ru')
tts.save('1.mp3')
mixer.music.load('1.mp3')
mixer.music.play()
while mixer.music.get_busy():
time.sleep(0.1)
mixer.music.stop()
mixer.music.load('0.mp3')
Программа читает вслух заголовки новостей, немного безжизненным и роботизированным голосом.
Исходники: http://pythono.ru/book/14/news.rar
Не забудьте, что для работы gTTS необходим доступ в интернет с нормальной скоростью.
В этом уроке мы повторили тему парсинга, а также научили нашу программу читать вслух текстовые строки.
Подписывайтесь на мой блог, будет еще много интересного и полезного!