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

User:你好我是森林 Date:2018-04-03 Mark:《Python网络数据采集》 原文:https://chensenlin.cn/posts/48792/

网络采集系列文章

Python网络数据采集之创建爬虫

Python网络数据采集之HTML解析

Python网络数据采集之开始采集

Python网络数据采集之使用API

Python网络数据采集之存储数据

Python网络数据采集之读取文件

数据清洗

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

记得之前我在爬去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)里形成以每个单词开始的二元数组。

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

[['\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。本小节主要是介绍一下该软件的安装和使用。也可以理解为一个图形化的应用,对于工具类的东西我一直有一个观点:点点点,就会了;何况还是图形化的。所以我不做介绍,看一下官网的三个视频就会了。

如果本文对你有所帮助,欢迎喜欢或者评论;如果你也对网络采集感兴趣,可以点击关注,这样就能够收到后续的更新。感谢您的阅读。

欢迎你免费加入我的星球,一起分享,共同成长。

知识星球

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java面试笔试题

UML中有哪些常用的图?

UML定义了多种图形化的符号来描述软件系统部分或全部的静态结构和动态结构,包括:用例图(use case diagram)、类图(class diagram)、...

1013
来自专栏web前端教室

《一个陌生同学的留言》-- “老尚,你一定要讲设计模式”

image.png 以前就曾经有人问过我,“老尚,你说是不是有的面试官以虐新人为乐?”,,,我说,“传说中,据说有”,,,他说,“我觉得这应该不是传说。” //...

2028
来自专栏Linyb极客之路

工作流引擎之activiti会签功能实现

在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任务,这种任务我们称之为会签任务。这种业务需求很常见,如一个请款单,领导审批环节中,就需要...

4.6K3
来自专栏IT派

那些神奇的一行 Python 代码

Python 这门语言非常的有趣,不仅可以做高大上的人工智能、大数据、机器学习。还可以用来做 Web、爬虫。还有其它很多的应用。今天我就给大家展示下一行 Pyt...

1684
来自专栏CSDN技术头条

6个编写优质干净代码的技巧

编写干净的代码并不是一件容易的事情,这需要尝试不同的技巧和实践。问题是,在这个问题上有太多的实践和技巧,因此开发人员很难进行选择,所以要把这个问题简化一下。在本...

19710
来自专栏Golang语言社区

厚土Go学习笔记 | 01. Hello World开篇

Go语言的众多特性,是我很长时间以来一直寻找的集合体。一直想在服务器编程方面有一个更舒适的语言。想舒适的实现跨平台,想舒适的实现并发,想舒适的实现纯代码解决问题...

3658
来自专栏程序员的知识天地

JavaScript编程趋势:用map和filter替换forEach

当你需要拷贝一个数组的全部或者部分到一个新数组的时候,优先使用map和filter而不是forEach。

1293
来自专栏机器之心

比Python还好用的Go语言要出2.0了,你想怎么设计?

在昨天的 Go contributor 年度峰会上,与会者对错误处理和泛型的设计草案有了一个初步的了解。Go 2 的开发项目是去年宣布的,今天谷歌公布了这一语言...

1301
来自专栏美团技术团队

Hades:移动端静态分析框架

作为全球最大的互联网 + 生活服务平台,美团点评近年来在业务上取得了飞速的发展。为支持业务的快速发展,移动研发团队规模也逐渐从零星的小作坊式运营,演变为千人级研...

1093
来自专栏Golang语言社区

(重载)厚土Go学习笔记 | 04. 导入和导出的不同 用math.Pi来举例

菅俊菠,70后IT人,程序员到产品经理/项目经理,先后涉猎教育、企管、煤矿、电商等多个领域的系统开发和团队管理工作。擅长业务分析、团队管理,关注前沿技术,目前注...

863

扫码关注云+社区

领取腾讯云代金券