前言
最近在学习python,看了廖雪峰的入门教程后,想做个小项目来练下手。于是在网上找了一段python 代码。该段代码能实现抓取网页文本,并进行词频分析的功能。
于是自己对照着一条条敲出来,并且自己添加了注释,最后运行成功时,爽爽滴,看来并不难嘛。
代码
以下代码实现了抓取一个web页面内容,然后对文本内容进行分词统计
备注
相应的python模板要安装好,可参考本博客的另一篇博文https://blog.csdn.net/yeziand01/article/details/80512675
>>> from bs4 import BeautifulSoup
>>> import urllib.request #使用urllib模块来抓取web页面
>>> response =urllib.request.urlopen('
http://php.net/')
>>> html=response.read() #结果包含许多需要清理的HTML标签
>>> soup = BeautifulSoup(html,"html5lib") #BeautifulSoup模块来清洗这样的文字
>>> text=soup.get_text(strip=True) #从抓取的网页中得到了一个干净的文本
>>> tokens = [t for t in text.split()] #将文本转换为tokens
>>> for key,val in freq.items(): #以键值的形式打印
... print(str(key)+':'+str(val))
>>>freq = nltk.FreqDist(tokens) #词频统计
>>> freq.plot(20,cumulative=False) #绘图
可以看到,统计结果是有of,a,an等没价值的单词,这些词都属于停用词,可以用下面的代码剔除。
>>> from nltk.corpus import stopwords #导入语料库中的停用词
>>> stopwords.words('english') #英文停用词
>>> clean_tokens = list() #创建一个list
>>> sr = stopwords.words('english') #创建停用词列表
>>> for token in tokens:
... if token not in sr: #剔除停用词
... clean_tokens.append(token)
>>>freq = nltk.FreqDist(clean_tokens) #词频统计
>>> freq.plot(20,cumulative=False) #绘图
参考引用
神级程序员花了三个礼拜来整理的资料!带来Python NLP入门教程!
续集
单单是重敲一遍代码,价值还是有限的。为了能修改代码,本菜鸡便一条条来弄懂代码背后的知识点。
>>> from bs4 import BeautifulSoup
#导入
BeautifulSoup模块
知识点:
该模块的库文件夹名称是bs4,安装完后被移入python3的lib库中,所以识别到的库文件就是bs4
>>> import urllib.request
#导入urllib模块中的request
知识点:导入
导入=某个模块可用于当前命名空间和当前python解释程序进程
有两种方法,import, from import 。from import可能会造成命名空间冲突,import不会造成命名空间冲突
from Module import other
#
直接导入模块中某
类、函数或变量,直接other()就可用
from
Module import *
#导入Module模块中所有'公开'的内容,内容直接可用
import Module
#导入
Module
模块,
对于模块中的函数,每次调用需要“模块.函数”来用
import Module.other
#导入Module模块中的某类,函数或变量
>>> response =urllib.request.urlopen('
http://php.net/')
#
使用
urllib模块
的
request类
的
urlopen函数
来抓 取web页面php.net
>>> html=response.read()
#
结果包含许多需要清理的HTML标签
知识点:read()方法
read方法可以指定一个参数读取多少,如果不指定的话,会一直读取到文件末尾,也就是一次性读取完。如果再次调用read方法,则什么也读取不到,因为文件指针已经移动到了文件末,没有内容。
>>> soup = BeautifulSoup(html,"html5lib")
#
BeautifulSoup模块来清洗这样的文字
知识点:Beautiful Soup4
Beautiful Soup
是一个可以从
HTML
或
XML
文件中提取数据的
Python
库;
不仅支持
HTML
解析器,还支持一些第三方的解析器,如,
lxml,XML,html5lib
但是需要安装相应的库;
- 参数1:指出要解析的文档是什么类型,目前支持, html, xml, 和 html5
- 参数2:指定使用哪种解析器: 目前支持, lxml, html5lib, 和 html.parser
>>> text=soup.get_text(strip=True)
#
从抓取的网页中得到了一个干净的文本
知识点:get_text()
这个方法获取到包含的所有文版内容,strip=True可除去文本前后的空白,并将结果作为 Unicode 字符串返回。
>>> tokens = [t for t in text.split()]
#
将文本转换为tokens
知识点:[] 和 split()
[ ]是数据类型-列表
split() 方法通过指定分隔符对字符串进行分割并返回一个列表,默认分隔符为所有空字符,包括空格、换行(\n)、制表符(\t)等。
>>>freq = nltk.FreqDist(tokens)
#词频统计
知识点:
FreqDist
nltk库中的函数,接收list后,自动创建字典dict,key是list的元素,value是元素出现的次数
>>> for key,val in freq.items():
#打印key+:+val
... print(str(key)+':'+str(val))
知识点:for循环
通过for来循环来遍历这个dict的key和value
>>> freq.plot(20,cumulative=False)
#绘图
知识点:
matplotlib库 的函数plot()可绘图,20代表x轴绘制的单词个数,cumulative=False表示非累积分布函数
>>> from nltk.corpus import stopwords
#导入语料库中的停用词stopwords
>>> clean_tokens = list()
#创建一个空list,存放清洗后的数据
>>> sr = stopwords.words('english')
#创建英文停用词列表
>>> for token in tokens:
... if token not in sr:
#剔除停用词
... clean_tokens.append(token)
>>>freq = nltk.FreqDist(clean_tokens)
#词频统计
>>> freq.plot(20,cumulative=False)
#重新绘图
进阶
试验当然不会就模仿,了解就完了。要会修改,迁移才是目标。
以上抓取的是
http://php.net/,换个格式 http://php.net ,仍能抓取成功。
那换个英文网站试下?
抓取:https://www.mysql.com/downloads/。(如下图所示)
得到的结果和观察的有差距,比如说网页上显示MySQL这个词汇应该是最多的,但抓取的结果却是Enterprise最多。而且,
网页上根本没有EditionMySQL这个词汇,但却被抓取出来。为何会如此呢?是参数问题么?这个有待继续研究。
展望
那中文网站怎么抓取并统计词频?英文的单词能够通过空格来区分,但中文单词并没有空格呀。
于是本项目的下一步就准备研究如何抓取中文网页并实现词频统计。