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