携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
前文回顾
一名前端工作人员的python爬虫实践记录【1】——通过urllib封装请求
一名前端工作人员的python爬虫实践记录【2】---BeautifulSoup
一名前端工作人员的python爬虫实践记录【3】--用正则表达式匹配html文档【上】
一名前端工作人员的python爬虫实践记录【4】--用正则表达式匹配html文档【中】
书接上文
在昨天的文章之中,我们解决了绝大多数的正则表达式,但是目前存在一个问题,那就是当面对这种情况下的信息的时候,该怎么处理呢?
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994 / 美国 / 犯罪 剧情
</p>
复制代码
这中间又有<br> 又有 这究竟要怎么处理呢?
Python里的re.S,re.M,re.I
众所周知,正则表达式的标记用于指定额外的匹配策略,标记也称为修饰符。
python里正则表达式的修饰符号有六个,分别是:
修饰符 | 作用 |
---|---|
re.I | 匹配无视大小写 |
re.L | 本地化识别 |
re.S | 使.能够匹配换行内的所有字符 |
re.M | 多行匹配 |
re.U | 根据Unicode字符集解析字符 |
reX | 自定义格式 |
由此可见,针对我们这种情况,首先需要在编写正则表达式的对象里加入re.S,使行内的所有信息都能得到匹配。
findbd = re.compile(r'<p\sclass="">(.*?)</p>', re.S)
bd = re.findall(findbd, item)
print(bd)
复制代码
让我们看看输出了啥:
由此可见,信息是全了,但是前面有很多的换行符,占位符怎么办呢?
后续处理
在上一篇的文章一名前端工作人员的python爬虫实践记录【4】--用正则表达式匹配html文档【中】中,我们了解到,可以使用replace方法去处理:
data.append(others.replace("\xa0/\xa0", ""))
复制代码
但是我们今天使用一个新的方法,那就是re.sub
re.sub
-
re.sub(*pattern*, *repl*, *string*, *count=0*, *flags=0*)
-
返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。 repl 可以是字符串或函数;如为字符串,则其中任何反斜杠转义序列都会被处理。 也就是说,
\n
会被转换为一个换行符,\r
会被转换为一个回车符,依此类推。 未知的 ASCII 字符转义序列保留在未来使用,会被当作错误来处理。 其他未知转义序列例如&
会保持原样。 向后引用像是\6
会用样式中第 6 组所匹配到的子字符串来替换。
简单点来说,sub也是替换,但是他替换的是只出现一次的匹配对象。
因此我们的代码可以改成:
bd = re.findall(findbd, item)
print(bd)
if len(bd) > 0:
bd = bd[0]
bd = re.sub("<br/>\s*", " ", bd)
bd = re.sub("[\n\s\xa0]", " ", bd)
data.append(bd.strip())
else:
data.append("")
复制代码
最终的输出如下:
收工了,然后下一步呢....?
根据我们在第一篇文章一名前端工作人员的python爬虫实践记录【1】——通过urllib封装请求下撰写的爬虫思路,那就是
python爬虫一共分为三个步骤,那就是:
- 爬取网页
- 解析数据
- 保存数据
现在爬取网页,解析数据都完成了,是时候到第三步,保存数据了。那就是我们下期的内容啦!
下期内容
- 使用Xlwt 将数据保存到excel之中
我是短袖撸码蒂尔尼
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!