Python 正则表达式 过滤html

这篇笔记适用于爬取网页信息时,选择保存整个html文件,再过滤得到其中需要的信息。


用到的技术是python正则表达式处理,推荐一篇正则表达式基础文章:点击打开链接

⑴通过re模块提供对正则表达式的支持
⑵使用到其中的功能函数findall(),实现遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
⑶使用到函数中的参数:re.S(DOTALL)使.匹配包括换行在内的所有字符、re.M(MULTILINE)多行匹配,影响^和$

-------------------------------------------------------------------------------------------------------------------

主要有两种处理方法:

一、获取一对标签中的内容

由于html中标签都是成对出现,如123

有时,我们需要获取标签之间的内容、链接,便可使用这个方法。

以爬取网易云音乐某一歌曲的歌名和歌手链接为例:

import re
content = '等你下课 (with 杨瑞代)周杰伦'
result_1 = re.findall(r'(.*?)',content,re.S|re.M)    #核心代码,获取   标签之间的内容
result_2 = re.findall(r'
输出结果:

['等你下课 (with 杨瑞代)']
['/artist?id=6452']


二、删除某些不需要的标签及其内容

有时,经过第一种方法筛选出来的内容仍有部分不是我们所需要的,则可使用第二种方法过滤掉,比如会遇到在html里表示换行的
标签,
我们可以利用python中的replace函数过滤掉它:

 if '
' in value: value = value.replace('
','') #核心代码,删除所有的
标签

如果我们需要过滤的标签中含有额外内容,这时我们可以利用方法1+方法2,先用正则表达式匹配出要过滤的内容,再用replace函数删除之。

例如:林俊杰的这条微博@了梁静茹、蔡依林、林志颖,因而html中多了这三位歌手微博的超链接,若我们只想得到这条微博的关键内容:
import re

content = '
飛機上偶遇的 J(JJ)F(Fish)J (Jimmy+Jolin)組合!
@梁静茹 @蔡依林 @夢想家林志穎
祝大家2018新年快樂!
' result = re.findall(r'(.*?)
',content,re.S|re.M) #核心代码,获取
标签之间的内容 result[0] = result[0].replace('
','') #删除所有的
标签 res = (re.findall(r'',result[0],re.S|re.M)) #匹配出将要删除的 之间的内容 for item in res: item = '' #拼接成将要删除的完整内容 result[0] = result[0].replace(item,'') #同二 print(result)
输出结果:
['飛機上偶遇的 J(JJ)F(Fish)J (Jimmy+Jolin)組合!   祝大家2018新年快樂!']


绝大多数情况下我们都可以通过以上两种方法完成对html的过滤,但不同情况要不同分析、灵活使用和搭配。

你可能感兴趣的:(python,爬虫)