爬取網易新聞


爬取網易新聞
     在本小節的內容中呢,筆者將會給大家講述如何去過濾我們所不需要的內容。下面的例子,是本人在爬取網易新聞時,遇到的一個小問題,在定位元素之后,進行打印的時候,出現了部分內容無法正常解析。筆者也是進行了很長時間的嘗試,請教了很多人,才得到的三種方法。我們一起來看。
通過寫入文件的方法過濾元素          
     import requests
     import  re
     from bs4 import BeautifulSoup as bs
      response = bs(requests.get('http://news.163.com/16/0712/17/BRPSKEFP0001121M.html').text,'html.parser')
      print('文章標題:',response.h1.string)
     #print(response.h2.string)
     #定位到含有('a',{'target':'_blank'})的元素,並輸出里面的text元素
      print("文章來源:",response.find('a',{'target':'_blank'}).text)
     #通過find_all方法遍歷(('div',{'id':'endText'})的內容,通過for循環,打印出div中所有的內容
     for style in response.find_all('div',{'id':'endText'}):
     # 通過for循環寫入style中的text內容到F文件
          with open("aa.txt",'a') as f:
               f.write(style.get_text())
     #通過for循環,寫入到文件aa.txt,將f中的所有的iframe過濾
          with open('aa.txt','r') as f:
               for i in f :
                    if 'iframe' in i:
                         pass
                    else:
                         print(i)
 
好的,代碼如上。我們接下來解讀一下這段代碼
首先,我們導入了requests庫和bs4的方法,然后通過bs4的方法,解析了我們爬取到的網易新聞的內容
然后,就可以開始使用bs4中的方法,進行打印我們想要獲得的內容了。
在這里,我們首先定位到h1打印了新聞標題,接着,使用find方法,找到了文章的來源
最后,通過find_all的方法,遍歷了符合('div',{'id':'endText'})的標簽下的所有內容,通過for循環去循環寫入到aa.txt的文件,再加入一個for循環與一個if的判斷,遍歷aa.txt的文件,然后過濾掉文件中所有帶有iframe的內容。
 
這里是,是由於,我之前寫的時候,定位到了正文內容,但是輸出的時候,總是無法輸出所有的正文,想到的取代的方法。那么接下來會有另外兩種方法,也來介紹給大家。
 
通過正則表達式過濾元素
     在上面那段代碼中,由於本人學藝不精,最初只能通過那種方法,進行過濾,下面我們來看看如何使用正則表達式,去過濾掉我們不需要的內容。
#通過正則表達式,過濾屌所有的不符合條件的html的標簽,使用re.sub,進行替換,然后打印出過濾完成的內容
#response = response = bs(requests.get('http://news.163.com/16/0712/17/BRPSKEFP0001121M.html').text
#clear = re.compile('<\s*script[^>]*>[^<]*<\s*/\s*script\s*>',re.I)
#content = clear.sub("",response)
#soup = bs(content,'html.parser')
#content = soup.find('div',{'id':'endText'})
#print(content.text.strip())
如果你有訪問這個新聞鏈接,並且進行過調試,就會看到,在我定位的div的元素中,是包含了另一個script的。那么在這里呢,我們通過了正則表達式,對返回的內容中的script里的內容進行定位,並且通過,r.sub的方法,將返回內容中的script進行了替換,全部替換為了空的。
當然,這部分的難點就在於如何去編寫這個正則表達式。筆者其實最初是有考慮過使用正則去實現過濾的,但是也是苦於不會編寫,無奈只能放棄。正則的話,各位也只能多練了。
 
使用lxml解析庫進行解析
經過多次的嘗試,筆者終於發現了問題所在,原來是解析庫使用錯誤導致了解析的時候出現了一些小問題。不過沒關系,我們也掌握了另外兩個方法。下面這段代碼就是我們使用lxml的解析庫的的方法。
#使用lxml解析庫,對爬到的頁面進行解碼
#response = bs(requests.get('http://news.163.com/16/0712/17/BRPSKEFP0001121M.html').text,'lxml')
#print('文章標題:',response.h1.string)
#print("文章來源:",response.find('a',{'target':'_blank'}).text)
#soup = response.find('div',{'id':'endText'}).find_all('p')
#for i in soup:
#    print(i.text)
OK,運行上述代碼之后,我們會發現,輸出的結果和使用正則過濾的是一樣的。那么,為什么會這樣呢?
我們都知道, Beautiful Soup包含了並不止一種的解析庫,而筆者之前使用的是html的解析庫,也就導致了,之前出現了部分script無法解析,過濾的情況。至於原因,目前筆者也是無法解釋清楚。不過呢,我們不要糾結於此。這次只是一個小小的教訓,也希望大家記住,當我們在使用一個庫無法達到想要的效果的時候,不妨嘗試另一個庫,也許會有驚喜哦。
上面的三種方法,都可以得到我們想要的結果。
在這里呢,只是想告訴大家,大道萬千,殊途同歸。實現的方法,有很多種;而我們,並不需要大家全部掌握,只需要能夠使用適合自己的就好。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM