从网站上爬下内容其实在python中是一件还比较简单的事情,如果不需要考虑各种反爬虫机制来说的话。

集体智慧学习的第四章是搜索与排名,各种索引的建立,我之后再总结。这里我主要总结下,如何整理爬取到的文字内容。问题解决的过程中使我进一步深化对python2各种编码机制的了解。

我只以一个简单的txt文档为例,文档内容如下:

列表消除右边python python去掉列表中的标点_文档

先上最后的效果图吧:

列表消除右边python python去掉列表中的标点_编码_02

一开始以为这个过程会很简单嘛,不就是建立一个ignoring_words的list,然后对文档中的每一个字进行检查。如果检查的字在ignoring_words里面,则省略,否则继续。想法是好的,也的确有网友提出了类似的想法。这不就是几行代码的事情呀(虽然最后的代码也只有几行代码。。。)本着这样的想法,我写了一下代码:

# -*- coding: utf-8 -*-
import codecs

ignoring_words = ['【', '】', ',']                                 #这是忽略的字符集
content = codecs.open('test.txt', 'r').read()                       #test.txt就是我上述给出的需要整理的内容
file = codecs.open('finished.txt', 'w', encoding = 'utf-8')         #打开一个新文档来存我整理后的内容
for word in content: 
    if word in ignoring_words:                                      #如果在,忽略
        continue
    else:
        file.write(word)

运行后,出问题了:

列表消除右边python python去掉列表中的标点_python_03

为啥就在写文件时出现问题了呢?算了,不想了,反正网友的历来那个是无穷的,我在网上又试着查找第二种思路。果不其然,找到了,利用正则表达式!(最后证明也不行,还我白惊喜一场)。具体代码是这样的:

import re
import string

content_s = content.replace(string.punctuation, '')

然而并没有什么卵用。。。但是我觉得这个方法应该可以去除英文标定符号!下次如果对英文文档进行整理,我再试试~


我又看到一个方法(小激动呢)!代码如下(此代码为粘贴过来的):

import re
temp = "想做/ 兼_职/学生_/ 的 、加,我Q:  1 5.  8 0. !!??  8 6 。0.  2。 3     有,惊,喜,哦"
temp = temp.decode("utf8")
string = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+".decode("utf8"), "".decode("utf8"),temp)
print string

这里注意,又是编码问题!!!出现在string= ...decode('utf8')这一行。


列表消除右边python python去掉列表中的标点_编码_04


这我就奇了怪了。。。


于是,潜行修行开始了。。。

工欲善其事必先利其器,应对编码问题,推荐大家安装chardet,直接pip install chardet即可。这个工具可以直接推断出字符串的编码格式:

temp = "想做/ 兼_职/学生_/ 的 、加,我Q:  1 5.  8 0. !!??  8 6 。0.  2。 3     有,惊,喜,哦"
print chardet.detect(temp)

{'confidence': 0.99, 'encoding': 'GB2312'}   #输出

这样以后妈妈就不用担心的我不知道字符串编码格式了~


这里我就直接上正确的代码了:


-*- coding: utf-8 -*-
import re
import codecs
import chardet
content = codecs.open('test.txt', 'r').read()                           #打开休要整理的文档,获得句柄
#print chardet.detect(content)				                #我所有需要整理的文档都是utf-8进行编码的,如果不知道的话,大家用chardet工具。
content = content.decode('utf-8')                    #python中的中文编码就是一个烦心事,最好的解决方法就是全部转化成unicode编码(python内部编码方式)

punct = codecs.open('puntuation.txt', 'r')                              #这是中文标点符号集:排列格式如下图
punctuation = list()
for line in punct:
    word = line.strip('\r\n')                                           #出去换行符,注意是\r\n
    word = word.decode('utf-8')                                         #当然标点符号也需要转换成unicode格式
    punctuation.append(word)       

file = codecs.open('finished.txt', 'w', encoding = 'utf-8')             #推荐大家使用codecs来打开文档,设置编码方式很方便
str = ''.decode('utf-8')
for item in content:
    if item in punctuation:                                             #如果是标点符号,即跳过
        continue
    else:
        str = str + item
    
    
file.write(str)                                                         #一次性写入整理后的文档

这是我需要忽略的标点符号文档文件:

列表消除右边python python去掉列表中的标点_集体智慧编程_05


这是效果图:

列表消除右边python python去掉列表中的标点_编码_06

咦咦咦!!!空格,那么多空字符怎么办???

给大家一个非常简答的方法来去除字符串内部的空格,当然如果是字符串两端的字符用strip( )会更好。

这里利用string.split(),在空格部分对字符串进行分割,然后利用join函数进行粘接。

例如:

content = ''.join(content.split())


把上述代码加入就完成中文标点符号的去除了!!!





还是总结一下吧:


1、中英文标点符号的编码肯定是不同的,即利用string.punctuation来表示中文标点符号是不行的。


2、python2中的中文编码问题很乱,最简单的思路就是将所有的编码转换成unicode编码。python中有两种编码方式转换函数:decode和encode:


decode是将源编码转化成unicode编码,encode是将unicode编码转换成指定编码。


例如:


s.decode('utf-8'):将原来用utf8编码的字符串s转换成unicode编码格式;


s.encode('gbk'):将原来unicode编码的字符串s转换成gbk编码格式。


当然还有s.decode('utf-8', 'ignore'),这样可以忽略其中无法编码的地方。


3、在写入txt文档时如果出现 'ascii' codec can't decode byte 0xef in position 0等这样类似的问题,一般是txt的编码方式有问题,如果是中文编码的话一般选择utf-8进行编码。


4、最好不要利用记事本进行文档的打开和设置。在notebook格式中选择utf-8 无bom格式,可以便面很多问题。


5、在写如文件时,用unicode编码:


例如: file.write(content) 其中的content最好用unicode斤西瓜编码