爬取网易新闻
爬取網易新聞 ?????在本小節的內容中呢,筆者將會給大家講述如何去過濾我們所不需要的內容。下面的例子,是本人在爬取網易新聞時,遇到的一個小問題,在定位元素之后,進行打印的時候,出現了部分內容無法正常解析。筆者也是進行了很長時間的嘗試,請教了很多人,才得到的三種方法。我們一起來看。 通過寫入文件的方法過濾元素? ? ? ? ? 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無法解析,過濾的情況。至于原因,目前筆者也是無法解釋清楚。不過呢,我們不要糾結于此。這次只是一個小小的教訓,也希望大家記住,當我們在使用一個庫無法達到想要的效果的時候,不妨嘗試另一個庫,也許會有驚喜哦。 上面的三種方法,都可以得到我們想要的結果。 在這里呢,只是想告訴大家,大道萬千,殊途同歸。實現的方法,有很多種;而我們,并不需要大家全部掌握,只需要能夠使用適合自己的就好。
轉載于:https://www.cnblogs.com/rookie-c/p/5754828.html
總結
- 上一篇: hive like 模糊匹配
- 下一篇: 关于开源堡垒机Jumpserver二次开