2013-10-29 40 views
0

我一直在學習Python的基本知識,上個月左右,雖然我非常善於打印'你好世界',我想學習一些額外的功能。我已經下載了BeautifulSoup4並使用Python2.7。我的目標是能夠從CNN或其他新聞來源獲取文章,並能夠取消4件事: 1)鏈接到網站 2)發佈日期的文章 3)文章的標題 4)文章的文章Web刮新聞文章和導出到CSV文件

我已經在stackoverflow中搜索了其他問題,並查看了其他示例代碼,但我在將其應用於我想要執行的操作時遇到了問題。我看到的大多數例子都是在刮一天的時間或天氣。我的主要問題是,當我查看特定網站的源代碼時,我很難知道我應該使用哪些標籤。

因此,舉例來說,如果我想從報廢以上4兩件事: http://www.cnn.com/2013/10/29/us/florida-shooting-cell-phone-blocks-bullet/index.html?hpt=ju_c2

會是什麼樣的代碼是什麼樣子?

回答

3

這是一個概念驗證碼,可以讓您的想法正常工作,只是爲了讓您知道,BeautifulSoup4真的很強大,它足以滿足您的第一階段在刮。

此外,您還需要閱讀CNN的服務條款,檢查是否允許刮擦。您可以在BS4文檔中找到以下代碼的每個細節的解釋,或者您可以通過計算器開始您的職業生涯,從社區中學習每一個細節,就像我所做的一樣:)祝您好運並享受它!

from bs4 import BeautifulSoup, SoupStrainer 
import urllib2 
import re 

def main(): 
    opener = urllib2.build_opener() 
    opener.addheaders = [('User-agent', 'Mozilla/5.0')] 
    url = 'http://www.cnn.com/2013/10/29/us/florida-shooting-cell-phone-blocks-bullet/index.html?hpt=ju_c2' 
    soup = BeautifulSoup(opener.open(url)) 
    #1) Link to the website 

    #2) Date article published 
    date = soup.find("div", {"class":"cnn_strytmstmp"}).text.encode('utf-8') 
    #3) title of article 
    title = soup.find("div", {"id":"cnnContentContainer"}).find('h1').text.encode('utf-8') 
    #4) Text of the article 
    paragraphs = soup.find('div', {"class":"cnn_strycntntlft"}).find_all('p') 
    text = " ".join([ paragraph.text.encode('utf-8') for paragraph in paragraphs]) 

    print url 
    print date 
    print title 
    print text 

if __name__ == '__main__': 
    main() 

輸出看起來是這樣的:

http://www.cnn.com/2013/10/29/us/florida-shooting-cell-phone-blocks-bullet/index.html?hpt=ju_c2 
updated 7:34 AM EDT, Tue October 29, 2013 
Cell phone stops bullet aimed at Florida gas station clerk 
(CNN) -- A gas station clerk's smartphone may... the TV station reported. 

同時,我們應該如何定位的元素一點從我的哲學:link here. 和硒/ Scrapy您還可能以後遇到..

+0

乙W.先生感謝您的回答。什麼是'utf-8'? – intelligentlywrong

+0

@intelligentlywrong UTF-8告訴蟒使用UTF-8這是怎麼瀏覽器解碼解釋文本。 http://en.wikipedia.org/wiki/UTF-8。否則,sth.text將返回字符串的Unicode來代替。 –

+0

我試圖運行你的代碼,但我得到的錯誤爲'沒有名爲「urllib2''模塊。我有Python 2.7使用Anaconda。 –

2

你會想要做的幾件事情:

  • 使用urllibpython-requests

  • 解析與BeautifulSoup4bs4

  • 頁確定的部分下載的網頁您想使用Chrome瀏覽器(或其他瀏覽器)通過開發者工具解析網頁(Ctrl + Shft + C)並單擊文章的文本正文,這將允許您查看要解析出的HTML元素。在這種情況下,你可以看到你想要的所有與類cnn_storypgraphtxt HTML元素,您可以用soup.find_all("p", class_="cnn_storypgraphtxt")

選擇我敢肯定,你就可以自己弄清楚休息,儘量因爲這些元素包含日期和標題等等。

2

你不會找到URL頁面網頁本身的,但是這不是一個問題,因爲你必須知道的網址,您獲取的頁面之前。

刮痧是在其最強大時,它的特定地點:您需要檢查的(比方說)在CNN網站的網頁格式,決定在那裏他們把文號,通過檢查找到自己的方式在文檔層次html源代碼,然後設計一種方法來提取它。

在你充其量只能識別泛型類型的信息的最一般的方法:你可以寫提取所有日期從頁面的腳本(或儘可能多的標準可以匹配),但沒有一般的方式來知道哪一個代表出版日期。同樣,在一個非常普遍的方式提取冠軍文本是最好的猜測,因爲有這麼多的方式嵌入在網頁中該信息(以及許多其他的事情該網站可以用它來混合) 。

最後,不要忘記,很多網站(儘管不是全部)會向您發送一個裸機html頁面,並使用javascript來填充內容。除非你使用類似webkit解釋的JavaScript嘗試刮的頁面之前,你的腳本將看到的東西從你的瀏覽器會顯示很大的不同。