Python网络数据采集之数据清洗|第06天

主要内容:数据清洗。

昨天有朋友在微信问我怎么没有更新,昨天回家整理了一些相关的东西,没来得及写文章。今天一个朋友听说我在简书分享,也和我一同加入了简书,很喜欢这样的感觉。之前军哥跟我说过,慢慢尝试去写,然后会有一部分人会被你影响,我发现是真的,真的能够影响到一部分人。闲话少说,开始今天的内容。

数据清洗

从本章开始,内容稍微复杂一点,但也不是那么难。

记得之前我在爬去boss网站的招聘信息的时候,抓取的数据并非我们所理想的样式,后面经过处理后,成为一个自己想要的样子,这个过程可以理解为数据清洗。这里的处理是在代码处理的,不是手工完成。

编写代码清洗数据

在此之前需要了解一下n-gram模型,它表示文字或语言中的n 个连续的单词组成的序列。在进行自然语言分析时,使用 n-gram或者寻找常用词组,可以很容易地把一句话分解成若干个文字片段。更多详情可以去维基查看一下,或者自行搜索。

下面通过代码将返回维基百科词条“Python programming language”2-gram列表:

from urllib.request import urlopen
from bs4 import BeautifulSoup

def getNgrams(content, n):
  content = content.split(' ')
  output = []
  for i in range(len(content)-n+1):
    output.append(content[i:i+n])
  return output

html = urlopen('http://en.wikipedia.org/wiki/Python_(programming_language)')
bs = BeautifulSoup(html, 'html.parser')
content = bs.find('div', {'id':'mw-content-text'}).get_text()
ngrams = getNgrams(content, 2)
print(ngrams)
print('2-grams count is: '+str(len(ngrams)))

ngrams 函数把一个待处理的字符串分成单词序列(假设所有单词按照空格分开),然后增加到 n-gram 模型(本例中是 2-gram)里形成以每个单词开始的二元数组。

我们得到的数据部分如下:

1

[['\nPython\n\n\n\n\nParadigm\nObject-oriented,', 'imperative,'], ['imperative,', 'functional,'], ['functional,', 'procedural,'], ['procedural,', 'reflective\n\n\nDesigned\xa0by\nGuido'],

显然,是需要处理的。

首选处理通过正则移除\n,再把 Unicode 字符过滤掉。先把内容中的换行符(或者多个换行符)替换成空格,然后把连续的多个空格替换成一个空格,确保所有单词之间只有一个空格。最后,把内容转换成 UTF-8 格式以消除转义字符。函数初步如下:

def ngrams(input, n):
    content = re.sub('\n+', " ", content) 
    content = re.sub(' +', " ", content)
    content = bytes(content, "UTF-8")
    content = content.decode("ascii", "ignore") 
    print(content)
    input = input.split(' ')
    output = []
    for i in range(len(input)-n+1):
        output.append(input[i:i+n])
    return output

Python获取所有的标点符号:

➜  url python
Python 3.6.4 (default, Mar  1 2018, 18:36:50)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import string
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

我们还要去除一些维基引用的标记、标点符号等;进一步进行清洗的函数:

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import re
import string

def cleanInput(input):
    input = re.sub('\n+', " ", input) 
    input = re.sub('\[[0-9]*\]', "", input) 
    input = re.sub(' +', " ", input)
    input = bytes(input, "UTF-8")
    input = input.decode("ascii", "ignore") cleanInput = []
    input = input.split(' ')
    for item in input:
        item = item.strip(string.punctuation)
        if len(item) > 1 or (item.lower() == 'a' or item.lower() == 'i'):
            cleanInput.append(item) return cleanInput
    
def ngrams(input, n):
    input = cleanInput(input) 
    output = []
    for i in range(len(input)-n+1):
        output.append(input[i:i+n]) 
    return output

这样处理后,我们的结果就稍微好点。

['Linux', 'Foundation'], ['Foundation', 'Mozilla'], ['Mozilla', 'Foundation'], [
     'Foundation', 'Open'], ['Open', 'Knowledge'], ['Knowledge', 'Foundation'], ['Fou
     ndation', 'Open'], ['Open', 'Source']

数据存储后再清洗

对于编写代码清洗数据,你能做或想做的事情只有这些。除此之外,你可能还需要处理一些别人创建的数据库,或者要对一个之前没接触过的数据库进行清洗。

主要额方法有编写脚本或者第三方工具。例如OpenRefine。本小节主要是介绍一下该软件的安装和使用。也可以理解为一个图形化的应用,对于工具类的东西我一直有一个观点:点点点,就会了;何况还是图形化的。所以我不做介绍,看一下官网的三个视频就会了。

官网地址:http://openrefine.org/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏精讲JAVA

Gof设计模式之静态工厂模式(五)

设计模式之静态工厂模式 01前言 该系列模式已经更新五篇,希望大家可以多看看以前的模式,并且从今天开始我打算换一种讲解方式,我不在贴出运行结果...

2056
来自专栏炉边夜话

调查问卷:测试你对多核多线程的认知程度

        目前,多核多线程编程已经成为一种趋势,但大部分程序员还没有从串行程序的思维中走出来。即使有些人对多核多线程的概念有所了解,但也是一知半解,...

1362
来自专栏牛客网

阿里一面 京东一面+二面

3724
来自专栏Java呓语

简单工厂模式(选择产品)

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。

791
来自专栏

消失的魔术:隐藏在js引用和原型链背后的超级能力

js这门语言有很多诟病,然而很多被无视的点,构成了js最为美妙的语言特性。这篇文章将带你走进魔术般的引用型数据类型和原型链背后,寻找那些被遗忘的超能力。并且,基...

1202
来自专栏Python绿色通道

Python爬虫:使用requests+re来爬取豆瓣图书

这两天在知识星球上有球友在使用requests+re来爬豆瓣图书的链接,书名及作者遇到了问题,虽然当时很快给他解决了,但由于我之前没有写这方面的文章,所以临时决...

4553
来自专栏张善友的专栏

读《代码不朽:编写可维护软件的10大要则》C# 版

这本书特别针对没有接受过计算机科学或软件工程专业学习的软件开发人员,这类人员除了熟悉所用语言语法和语义之外,很少接受其他专业培训,对软件工程中的一些概念理解欠缺...

6830
来自专栏java学习

java成员变量和局部变量

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

31812
来自专栏撸码那些事

【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象

一种重要的抽象实现手法是创建内聚而完整的抽象。抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性。如果抽象只支持部分相关的方法,其使用者就可能不得不自己去实...

1759
来自专栏圣杰的专栏

DDD理论学习系列(11)-- 工厂

1.引言 在针对大型的复杂领域进行建模时,聚合、实体和值对象之间的依赖关系可能会变得十分复杂。在某个对象中为了确保其依赖对象的有效实例被创建,需要深入了解对象实...

26810

扫码关注云+社区

领取腾讯云代金券