Python網絡編程:初探nltk與美湯結合處理網絡數據

前置要求

使用Python BeautifulSoup 包得到網頁數據,須要用戶電腦中安裝了BeautifulSoup包。該包支持pip安裝,可輸入以下指令安裝:html

pip3 install BeautifulSoup4

導入網頁數據:urlopen(URL)

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

輸入圖片說明

加工文本數據:BeaurifulSoup和正則表達

使用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入門一:文本的信息統計、搜索和詞頻統計概覽

NLTK入門二:NLTK文本分析初步

輸出處理文檔:

最後,咱們能夠對於處理完畢的文檔進行輸出。文本輸出既能夠直接以單詞列表的形式:

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()

輸入圖片說明

參考資料:

  1. NLTK官方文檔,http://www.nltk.org/
  2. NLTKbook模塊官方文檔,http://www.nltk.org/book/
  3. 墨爾本大學科研委員會(Resbaz)NLTK培訓課程
  4. Jupyter notebook常見快捷鍵:https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcut
  5. 更改Jupyter notebook起始目錄的四種方法,URL:https://blog.csdn.net/qq_33039859/article/details/54604533
相關文章
相關標籤/搜索