一名前端工作人员的python爬虫实践记录【5】--用正则表达式匹配html文档【下】

564 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

前文回顾

一名前端工作人员的python爬虫实践记录【1】——通过urllib封装请求

一名前端工作人员的python爬虫实践记录【2】---BeautifulSoup

一名前端工作人员的python爬虫实践记录【3】--用正则表达式匹配html文档【上】

一名前端工作人员的python爬虫实践记录【4】--用正则表达式匹配html文档【中】

书接上文

在昨天的文章之中,我们解决了绝大多数的正则表达式,但是目前存在一个问题,那就是当面对这种情况下的信息的时候,该怎么处理呢?

<div class="bd">
                        <p class="">
                            导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
                            1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
                        </p>

这中间又有<br> 又有 &nbsp; 这究竟要怎么处理呢?

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)

让我们看看输出了啥:

image.png

由此可见,信息是全了,但是前面有很多的换行符,占位符怎么办呢?

后续处理

在上一篇的文章一名前端工作人员的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("")

最终的输出如下:

image.png

收工了,然后下一步呢....?

根据我们在第一篇文章一名前端工作人员的python爬虫实践记录【1】——通过urllib封装请求下撰写的爬虫思路,那就是
python爬虫一共分为三个步骤,那就是:

  • 爬取网页
  • 解析数据
  • 保存数据

现在爬取网页,解析数据都完成了,是时候到第三步,保存数据了。那就是我们下期的内容啦!

下期内容

  • 使用Xlwt 将数据保存到excel之中

我是短袖撸码蒂尔尼
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg