解析征友资料HTML页面

纳兰性急

在西藏旅游时碰到了两个有趣的90后,给我推荐了一个有趣的微信公众号:纳兰性急。(新浪微博:@纳兰性急)每周末发布三期交友信息:星期五为男士专场,星期六、日为女士专场。每期有大概15个人。每个人投稿的内容包括微信号,个人信息,和求偶要求之类,每份资料个格式大致为:

  • 编号(一个给定的标记号码)
  • 微信号
  • 年龄
  • 身高
  • 城市
  • 职业
  • 兴趣爱好
  • 求偶要求
  • 一句话介绍自己
  • 一张照片

具备敏锐数据嗅觉的我立即发现这是一个能挖出很多有趣故事的东西。比如:投稿人的年龄分布、地点分布、身高分布、职业分布;这些分布在男女上是否有显著不同;在兴趣爱好,自我介绍,和求偶要求上是否存在高频词;等等。

信息由每个人自己撰写投递,纳兰在整理的时候想必也没有考虑到挖掘网页的人,因此资料的格式比较混乱。每一项的名称标记不统一,光城市就有十多种写法;每一项填写的格式也各式各样,比如年龄就有“30”,“30岁”,“1985”,“85”,“85年”,“芳龄30”等等很多种写法;HTML的结构也不是统一的,比如有的人用“
”换行,而不是用“

”排版;另外,很多人使用一些表情符也会导致读取编码出错。

试试看吧。Github:https://github.com/wangguansong/nlxj-profiles

##HTML页面解析

第一步是读取和解析HTML文件。

每期,所有人的资料都写在一个很长的HTML行里,被包含在id为“js_content”的div中。现找到此行。

每份资料之间由一行很长的横线分割,于是用”—–“(五个以上的“-”)将此长行分割。

分割后的最后一段总是这个平台的介绍或者广告,可以舍弃;第一段是标题,包含本期编号以及性别,把此标题复制到每一份资料中,使得每一份资料都可以单独使用。一切顺利的话,现在已经将每一个人的资料分割开了

大多数资料用“

”排版。对每一份切割后的文本,进一步用“

”切割。清理切割之后的文字,删掉HTML的标记以及无用的空格等等。

如果一切运行顺利,得到的结果是一个文本向量(character vector)的列表(list),每个向量包含了一个人的资料。

修改HTML原文件

然而文本挖掘从来不会一切顺利。R脚本经常会报错,因为无法读取HTML中的表情符,大概是中文编码中特有的而UTF-8中不包括的符号。好在并不是很多,所以每个错误发生之后可以锁定问题文本,从原HTML文件中删除表情符。

在整个脚本运行成功之后,检查得到的列表发现,有的文本向量的长度仅为5,正常的情况其长度应该大于10。原因是一些资料用“
”而不是““

”分隔信息。我写了一个R程序以处理这种情况,但其实并不很多见,所以还是统一标准,直接修改了原HTML文件。

结果(2012/12/29更新)

一共搜集了190期,2509份资料。

王冠嵩
王冠嵩
数据工作者

Everyone knows it’s Butters.