使用Python BeautifulSoup 包得到網頁數據,須要用戶電腦中安裝了BeautifulSoup包。該包支持pip安裝,可輸入以下指令安裝:html
pip3 install BeautifulSoup4
Python網頁數據的讀寫與I/O讀寫操做相似,所以如下操做讀入維基百科「霧霾」這一頁的數據:架構
from urllib.request import urlopen from bs4 import BeautifulSoup raw = urlopen("http://en.wikipedia.org/wiki/Smog").read() print(type(raw)) print(raw[100:200])
讀入的數據以字節流的形式呈現app
使用BeautifulSoup類便可將其轉化爲BeautifulSoup的對象:網站
soup = BeautifulSoup(raw, 'html.parser') print(type(soup))
如下代碼獲取網頁文件位於<p></p>標籤之間的段落文本數據,並存在texts列表中:url
texts = [] for para in soup.find_all('p'): text = para.text texts.append(text) print(texts[:10])
若是須要去掉得到數據中的全部應用(如「[1]、[2]」等),能夠對文本進行以下處理:.net
import re regex = re.compile('\[[0-9]*\]') joined_texts = '\n'.join(texts) joined_texts = re.sub(regex, '', joined_texts) print(type(joined_texts)) print(joined_texts)
joined_texts這個文本字符串首先由texts每個元素用換行符串起來得到。做處理時,以它爲輸入文本,將其中表示維基引用的符號所有替換爲空字符串便可。code
而後,就能夠對得到的joined_texts進行一些處理,例如:htm
import nltk wordlist = nltk.word_tokenize(joined_texts) print(wordlist[:8]) good_text = nltk.Text(wordlist) good_text.concordance('smog')
得到一些關於霧霾這個單詞的信息。對象
更多NLTK有關信息,詳情請見:blog
最後,咱們能夠對於處理完畢的文檔進行輸出。文本輸出既能夠直接以單詞列表的形式:
NLTK_file = open("NLTK-Smog.txt", "w", encoding='UTF-8') NLTK_file.write(str(wordlist)) NLTK_file.close()
也能夠以處理以後文本的形式:
text_file = open("Smog-text.txt", "w", encoding='UTF-8') text_file.write(joined_texts) text_file.close()
Beautiful 用於其餘語言(如中文網頁信息),仍然須要通過特殊處理,本文的代碼不必定直接適用。好比,中文的換行符號是u'\xa0',以及不少中文網站架構都與通常國際上的不一樣。每每須要多重操做。如下爲一個爲鄰居追星族爬百度頁面的典型代碼:
# -*- coding: utf-8 -*- from urllib.request import urlopen from bs4 import BeautifulSoup import re raw = urlopen("https://baike.baidu.com/item/%E7%8E%8B%E4%BF%8A%E5%87%AF/75850").read() #Tesing code to test wheather link is successful: #print(type(raw)) #print(raw[100:200]) text_soup = BeautifulSoup(raw, 'html.parser') #print(text_soup) texts = [] for para in text_soup.find_all('div'): text = para.text texts.append(text) texts = texts[72 : -104] #print(texts) regex = re.compile('(<cite>([^<>\/].+?)</cite>)+') joined_texts = ''.join(texts) joined_texts = re.sub(regex, '', joined_texts) regex = re.compile('\[[0-9]*\]') joined_texts = re.sub(regex, '', joined_texts) words = joined_texts.split('\n') while u'\xa0' in words: words.remove(u'\xa0') while '' in words: words.remove('') joined_texts = '\n'.join(words) text_file = open(u"王俊凱.txt", "w", encoding='UTF-8') text_file.write(joined_texts) text_file.close()
參考資料: