处理5000多个html,并提取当中有用的用户信息

处理5000多个html,并提取当中有用的用户信息


引子

今天同事ran哥给了我1个文件夹,里面有5000多个html页面,想要提取当中有用的信息。

这些html内容大概长这样:



任务:

提取出当中画红线部分的信息,也就是

  • userid
  • usercode
  • username
  • phone

value当中的值.


思路:

因为用正则表达式比较多,一上来就直接选择用正则表达式。

在参考知乎这个回答正则表达式如何匹配网页里面的汉字?的时候,似乎有别的方法比较快,就是用别的库去解析。

  • xpath
  • Beautifulsoup

不用自己手写那么挫的正则表达式。。。

下次有空试试这两种方法才行~

扫描二维码关注公众号,回复: 1451953 查看本文章

关键概念:

编码概念:

无法输出中文:

在编码这上面被坑了不少时间。

一开始是将获得的数据是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码转换为中文,好像有点麻烦。

接着参考了知乎的一个回答:

Python 如何将 Unicode 转换到汉字?

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格式来进行程序处理。

关于Python的编码、乱码以及Unicode的一些研究


文件I/O file处理:

file = open('100.txt','a')
    file.write(userid+usercode+username+phone+"\n")
    file.close()

一开始用wr之类的模式,发现写进txt里的内容都只有一条,原因是:

  • r模式
    • 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

也就是说,每次向txt里写数据都从文件的开头写,所以每次写入都不断替换
原有的数据,导致只有一条数据。

如果想追加在后面写,要用

  • a模式
    • 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

Python 文件I/O


最后处理结果:

写进一个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可以整齐地输出一个表格信息:

哇嘎嘎~


代码

处理5000多条数据,并提取当中有用的用户信息

所用数据data.7z集涉及敏感信息,就加密啦。


参考:

猜你喜欢

转载自blog.csdn.net/qq_28921653/article/details/78945605