处理5000多个html,并提取当中有用的用户信息
引子
今天同事ran哥给了我1个文件夹,里面有5000多个html页面,想要提取当中有用的信息。
这些html内容大概长这样:
任务:
提取出当中画红线部分的信息,也就是
- userid
- usercode
- username
- phone
value当中的值.
思路:
因为用正则表达式比较多,一上来就直接选择用正则表达式。
在参考知乎这个回答正则表达式如何匹配网页里面的汉字?的时候,似乎有别的方法比较快,就是用别的库去解析。
- xpath
- Beautifulsoup
不用自己手写那么挫的正则表达式。。。
下次有空试试这两种方法才行~
关键概念:
编码概念:
无法输出中文:
在编码这上面被坑了不少时间。
一开始是将获得的数据是gbk编码格式的,我是先将它gbk解码,再utf8编码
data = file.read().decode('gbk').encode(utf-8)
然后再用这样的数据集,去处理去正则匹配我想要的信息
其他信息基本上都没问题,但是在处理中文信息这部分出问题了。
这样的数据集,在正则匹配后中文名字后:
username = re.findall('name="username" value=(.*?)/> ', data, re.S)
输出的名字结果是这样奇怪的格式
['"\xe9\x99\x88\xe6\xb6\x8c\xe6\xb3\x89" ']
['"\xe5\x8c\x85\xe6\xb5\xb7\xe4\xba\xae" ']
['"\xe8\x94\xa1\xe5\x86\x9b\xe6\x98\x8e" ']
['"\xe5\xb2\x91\xe6\xb3\xa2" ']
['"\xe6\x9b\xbe\xe9\xb9\x8f\xe4\xba\x91" ']
['"\xe9\x99\x88\xe6\x98\x86" ']
['"\xe5\xb8\xb8\xe5\x87\x8c\xe8\xbe\x89" ']
charset检测数据的编码格式:
参考了这篇文章,python语言\xe6\x97\xa0\xe6\xb3\x95\xe5\x8a\xa0\xe8乱码字符转换
试了试,charset这个模块,可以去检测你的数据的编码格式。
我用来检测了一下我上面的格式:
print chardet.detect(username)
输出结果是:
{'confidence': 1.0, 'language': '', 'encoding': 'ascii'}
想要输出中文,就要把ascii码转换为中文,好像有点麻烦。
接着参考了知乎的一个回答:
unicode编码格式下,输出中文:
这下可以换个更简单的方法了,不过这涉及到python在处理编码的问题了。
方法:
- 把数据集gbk解码,这个时候编码是Python默认编码是unicode
data = file.read().decode('gbk')
- 正则匹配
username = re.findall('name="username" value=(.*?)/> ', data, re.S)
- 列表转换为字符串
username = str(username)
- 编码转换
username = username.decode('unicode-escape').encode('utf-8')
- 要在字符串前面加u,然后才能utf-8编码出中文来
编码总结:
一门热门起来的编程语言,首先要满足的需求之一就是,对不同国家和地区所用字符的友好支持。
Python很好的做到了这一点,至少,在它正式引入Unicode编码以后是这样。
我们都知道Python是一门世界通用的编程语言,如果它的源代码文件中出现的都是ASCII支持的字符,那Python会以ASCII编码的格式处理程序。
不过,一旦源代码中出现了ASCII不支持的字符,它该怎么办?我用一张图来回答你吧
也就是说,所有超出ASCII范围的字符的处理工作,无论在输入之前,或者输出之后是什么编码格式的,它们在Python的执行内存中,都被统一转换(decode)为Unicode格式来进行程序处理。
文件I/O file处理:
file = open('100.txt','a')
file.write(userid+usercode+username+phone+"\n")
file.close()
一开始用wr之类的模式,发现写进txt里的内容都只有一条,原因是:
- r模式
- 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
也就是说,每次向txt里写数据都从文件的开头写,所以每次写入都不断替换
原有的数据,导致只有一条数据。
如果想追加在后面写,要用
- a模式
- 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
最后处理结果:
写进一个txt文件,大概就是5000多条信息
长这样
估计是我的正则表达式太烂了,或者是比较少用python来做处理的文件。
总之,就是Python太烂了哈哈哈
之后就把这个结果交给同事ran哥,他用他的excel大法清楚干净了这些数据。
更新:
刚解决完一个处理中文文件的问题后,对python的编码转换有一个更清晰的认识了。
决定更新一下代码,就是把数据清理方面再完善一下。
一些坑的记录:
re.findall()返回的是一个unicode编码的列表。
string与list
list = [u'"5092" ']
输出出来是"5092"
string = u'5092'
输出出来是5092
清理双引号:
- 之前用的是
string.strip(" ")
,应该用string.replace("\""," ")
- 之前用的是
#获取userid,这是个unicode编码的列表
userid = re.findall('name="userid" value=(.*?)/> ',data,re.S)
#从列表中取出数据,再去掉双引号
userid = userid[0].replace("\""," ")
更新后数据就变成这样啦。
用了prettytable可以整齐地输出一个表格信息:
哇嘎嘎~
代码
所用数据data.7z集涉及敏感信息,就加密啦。