Python 爬虫文本信息提取小案例-正则+暴力提取(附代码)

Python 爬虫文本信息提取小案例-正则+暴力提取(附代码)

数据说明

假设我们爬到了某些城市的房子交易价格信息,保存在一个 txt 文件中:

文本数据说明:

  • 每行为一条数据;
  • 每条数据中只有一个价格信息;
  • 价格用数字表示,但是单位可能是“万/平”,或“万/平方米”

清理方法一:暴力遍历清理

## 读取文本文件
with open("prices.txt") as f:
    lines = f.readlines()
## 每一行只有一个价格数据
lines
[Out: ]
['上海市-浦东新区-爱丁堡小区0 普通公寓 新房10.1 万/平\n',
 '上海市-浦东新区-爱丁堡间小区1 普通公寓 新房 1.1234 万/平\n',
 '上海市-浦东新区-爱丁堡小区1 普通公寓 新房 2.1 万/平\n',
 '上海市-浦东新区-爱丁堡小区3 普通公寓 新房3.1000 万/平\n',
 '上海市-浦东新区-爱丁堡小区3 普通公寓 新房 5.1 万/平\n',
 '上海市-浦东新区-爱丁堡小区5 普通公寓 新房 1 万/平方米\n',
 '北京市-浦东新区-帝都小区0 普通公寓 新房 20.1 万/平\n',
 '北京市-浦东新区-帝都小区1 普通公寓 新房 2.1234 万/平\n',
 '北京市-浦东新区-帝都小区1 普通公寓 新房 3.1 万/平\n',
 '北京市-浦东新区-帝都小区3 普通公寓 新房4.1000 万/平\n',
 '北京市-浦东新区-帝都小区3 普通公寓 新房 5.1 万/平\n',
 '北京市-浦东新区-帝都小区5 普通公寓 新房 0 万/平方米\n']

返回的是一个列表,列表中每一个元素,就是我们的一行。行最后换行,用 "\n" 表示。

接下来,我们将遍历每行,从行中间提取出我们想要的数字信息。

这里遍历的意思是,逐行处理,每一行都是特别的,所以每一行定位到的数字的位置都可能不同。

代码关键之处:

  • 找出每行第一位数字的位置(索引),以及最后一个数字的位置;
  • line[index]=="." 来判断某个字符是否为小数点;
  • line[index].isdigit() 来判断某个字符是否为数字;
for line in lines:
    posr = line.find('万/平')
    ## 找到的话,返回索引,找不到的话会返回 -1 
    if posr<0:
        posr = line.find('万/平方米')
        ## 如果还找不到,就换个找法。这里 万/平 其实已经包含了 万/平方米
        if posr<0:
            print("文本中不包含价格信息,请重新导入文本!")
    ## 价格数字最后一位的索引
    idx = pos - 1
    ## 回退到前面的非数字字符
    while line[idx]=='.' or line[idx].isdigit():
        idx -= 1 ## 回退
    posl = idx + 1 ## 价格的第一个数字
    ## 输出价格数字结果
    print(line[posl:posr])

这里,我们每处理完一行,立即输出结果。

最终结果如下:(参考第二种方法的结果,两者一致)

清理方法二:正则表达式 Regular Expression

正则表达式,可以帮助我们快速定位我们想要的信息,而不需要用索引来具体定位。

一般来说,re 的处理方式都是非常高效的。

## re