運用上一篇文章所介紹的狂新聞配音程式,接下來我們要寫一段小程式幫我們去抓真正的新聞,然後一條一條唸給我們聽。當然,唸新聞的人還是我們上一篇文章所設計的say副程式,但是,這一次我們要使用requests去新聞網站抓即時新聞,然後使用BeautifulSoup解析之後,再把分析之後的每一條新聞標題丟給say副程式,讓Google小姐唸給我們聽。也是一樣,先看程式:

from bs4 import BeautifulSoup
import requests
from gtts import gTTS
import tempfile
from pygame import mixer
 
def say(text, filename=None):
    with tempfile.NamedTemporaryFile(delete=True) as temp:
        tts = gTTS(text, lang='zh')
        if filename is None:
            filename = "{}.mp3".format(temp.name)
        tts.save(filename)
        mixer.init()
        mixer.music.load(filename)
        mixer.music.play()
        while mixer.music.get_busy() == True:
            continue
        mixer.quit()
        
res = requests.get("http://m.ftv.com.tw/newscategory.aspx")
soup = BeautifulSoup(res.text, 'lxml')
sections = soup.find_all('section')
for section in sections:
    lis = section.find_all('li')
    for li in lis:
        url = 'http://m.ftv.com.tw/' + li.a['href']
        text = requests.get(url).text
        news_soup = BeautifulSoup(text, 'lxml')
        title = news_soup.find(id='h2')
        content = news_soup.find(id='content3')
        print(title.text)
        say(title.text)
        #print(content.text)
        #say(content.text)

在上面的程式中我們很暴力地手工找出民視新聞的手機版新聞,先找出所有的類別(section),然後再找出每一個類別中的每一條新聞的連結,再從這些連結去擷取新聞的內容,其中標題的文字放在title變數,而新聞的內文則是放在content。因為新聞的內文實在是很長,所以在上述的程式中讀者們應該有注意到我是把它註解掉的,有興趣的讀者可以自行把註解移除試試,這會花你很長的時間去聽完所有的新聞,而且如果該篇新聞過長還會出現錯誤,你必須還要把文字拆成幾個段落才行,這些就留給讀者們自由發揮吧。

由於程式是以手工的方式找出這個網站所使用的標籤內容做為擷取文字內容的依據,所以當你發現沒有辦法抓到正確的資料時,可能要自己去看網頁的原始碼,然後再動動腦筋囉。以下是程式執行的錄影畫面: