python网络爬虫——正则表达式匹配豆瓣读书:新书速递——血泪踩坑史!!

作为python网络爬虫小白一坨……在用requests库+正则表达式爬取网页的时候,用正则表达式匹配html标签的时候,即使看了正则表达式的知识还是无法匹配的那么顺利……从一个坑出来又掉入了另一个坑……

先查看要爬取的网页的源码:

豆瓣读书:新书速递    链接:url = 'https://book.douban.com/latest?icn=index-latestbook-all'

审查元素(shift + ctrl + I):

匹配:

我要爬取每本书的书名,评分,出版信息,描述,用正则表达式匹配,思路如下:

#解析页面
def parsepage(html):
	try:
		#re.S参数使.匹配包括换行在内的所有字符,生成一个正则表达式对象
		pattern = re.compile(r'...(用正则匹配书名)'
			+r'...(用正则匹配分数)'
			+r'...(用正则匹配出版信息)'
			+r'...(用正则匹配描述)',re.S)
		#在html中遍历匹配,返回一个列表
		items = re.findall(pattern,html)
	
		#用一个生成器来储存遍历得到的结果
		for item in items:
			yield {
				'title': item[0],
				'score': item[1].strip(),
				'publish': item[2].strip(),
				'detail': item[3].strip()
			}#存入字典
	except:
		print("Parsepage not succeed")

首先匹配书名,我备份了另外一份单独测试了一下匹配书名的正则表达式:

pattern = re.compile(r'<a\shref="https://book\.douban\.com/subject/\d{8}/">(.*?)</a></h2>'

本以为信心满满,结果竟然匹配不出来!!!

我以为是(.*?)的问题,后来测试发现没有错,(.*?)就是匹配所有内容,那就没道理了啊啊啊啊啊啊啊……然后我就改改两边标签的匹配代码看看……结果发现去掉</h2>就能匹配成功……无语了。

此坑一出自以为能长驱直入,结果又入一坑……

接着匹配剩下的三个,写完又又又又匹配不出来!!!只好一个一个单独测试:

单独测试出版信息,我先开始用

[\u4e00-\u9fa5\[\]\|·-/]*

匹配中间汉字及一些字符,发现匹配出结果了……“哎?!怎么感觉信息有点少?”,跑去检查网页发现,出版信息里竟然还有西班牙语和一些不规范参差不齐的字符……所以这些信息就没有匹配上……我首先就想到之所以没有匹配出结果是因为这一项没有匹配全,而无法与其他三项一一对应而无法形成列表……于是我想我还是老老实实地写(.*?)吧。

这样一来单独测试评分和描述的时候就同样顺利地匹配了,心情大好!

—————————然后我将分别单独测试完成的四项放在一起……结果再一次完蛋了……————————————

我陷入了沉思……去网上仔细翻看其他的人爬取其他的页面是怎样写正则表达式的,然后发现了我的智障

既然放在了一起是一个整体的正则表达式字符串,我把四个   断开的   单独测试的正则表达式字符串(单独测试的时候正则表达式只写了要匹配部分最近的一两个标签或特有属性)放在一起当然无法匹配整个字符串了啊!

但如果补全中间断开的标签及内容时又发现会出现上述第一次出现的问题,匹配不出来,参考网上匹配其他页面的正则表达式的写法我终于明白套路了:

pattern = re.compile(r'<a\shref="https://book\.douban\.com/subject/\d{8}/">(.*?)</a'
			+r'.*?lightgray">(.*?)</span'
			+r'.*?color-gray">(.*?)</p'
			+r'.*?detail">(.*?)</p>',re.S)

每项匹配内容前后当只有一个HTML标签尖括号<>时才能匹配成功,那我直接将前一项的匹配内容的后面的标签和后一项的匹配内容的前面的标签融合在一块,中间的内容用.*?代替不就得了……bingo!

——————————最后,我再一次用微微颤抖的双手点击了运行按钮……成成…成功了—————————————

为了完成作业,自学爬虫的时候时间有点少,没有买资料书好好学习,所以在正则表达式匹配这一块栽了很多次(我在这块踩的大大小小的坑其实比上述的还要多,耗费了大量时间精力,还影响心情)……我知道我犯的错误都是智障且肤浅的……以后会好好学习……

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值