网站内容抓取(正则表达式在python中的强大用处,你知道吗?(上) )

优采云 发布时间: 2021-10-22 04:02

  网站内容抓取(正则表达式在python中的强大用处,你知道吗?(上)

)

  昨天我们讲了正则表达式的一些常用语法规则,所以今天董瑶就用例子来讲解正则表达式在python中的强大用法。

  1

  正则表达式常用函数和方法

  在python中使用正则表达式,需要导入正则表达式模块(re)。这是python中内置的模块,所以不需要安装,但是需要注意的是我们在给文件命名时不要使用这个名字,否则会导致模块名冲突导致无法使用。

  

  re中的flag参数及其含义

  1.忽略大小写(常用)

  I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE

  2. \w、\W、\b、\B等是否生效取决于当前系统环境(其实没用)

  L = LOCALE = sre_compile.SRE_FLAG_LOCALE

  3. 匹配Unicode字符串,主要针对非ASCII字符串,因为python2默认字符串都是ASCII编码的,所以模式\w+可以匹配所有ASCII字符,如果想让\w+匹配Unicode字符,可以设置这个标志

  U = UNICODE = sre_compile.SRE_FLAG_UNICODE

  4.多行匹配,主要是匹配行首(^)或行尾($)时,如果不使用多行匹配,则无法匹配多行文本成功

  M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE

  5. 让句号(.)也代表换行(常用)

  S = DOTALL = sre_compile.SRE_FLAG_DOTALL

  6.忽略表达式模式中的空白字符和注释

  X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE

  2

  爬虫实战案例

  以散文网站《》为例,董瑶将演示如何使用正则表达式提取文章 散文网站的标题、网址等内容。示例网页内容收录文章标题、文章url等内容。原网站内容截图如下:

  

  下一步是使用python爬虫爬取网页内容:

  1

  导入模块

  re 模块:Python 内置的正则表达式模块

  请求模块:http请求模块

  urllib.request:里面的headers主要用于模拟浏览器请求

  2

  模拟浏览器请求

  有些网站设置了反爬虫机制,也就是说网站服务器会根据User-Agent的值判断是否是浏览器的请求。我们在使用python爬虫爬取内容的时候,如果不设置User-Agent的值来模拟浏览器请求,那么我们可能会被拒绝访问网站,内容就不会被爬取。

  所以在做网络爬虫的时候,一般会使用urllib.request模块中的headers方法来模拟浏览器的请求,这样网站服务器对我们的爬虫是开放的。

  headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

  req = urllib.request.Request('',headers=headers)

  # html 保存整个页面内容

  html = requests.get('')

  html = html.text

  3

  获取网页内容

  使用requests模块的get方法将网页内容获取到自定义变量中。这里需要注意的是,返回的请求是一个响应对象,里面存储了服务器响应的内容。如果我们要使用内容,还需要使用text方法对响应的文本编码进行解码(注意下图两个html的区别,第一个是响应对象,第二个是实际的网页内容) .

  4

  使用正则表达式匹配网页标题(title)

  通过观察源码,我们发现需要的网页标题title就是放在中间的文字内容。这时候就需要使用正则表达式来匹配内容:'(.*?)'。使用括号对需要提取的内容进行分组,方便后续提取分组内容,使用“.*?” 过滤不需要的内容。

  这里有同学可能会问,为什么要用“.*”?而不是“.*”来匹配?这是因为“.*”是一种贪婪模式。这个时候,会尽可能多的匹配,还有呢?意味着尽可能少的匹配。例如,现在有以下文本:

  经典散文_Classic文章

  我们可以看到它收录了3对组合,也就是说有3个标题,那么这个时候“.*”的匹配结果会从第一个开始,直到最后一个结束,所有的匹配。进去:

  

  如果加上?,就会以正确的形式一一匹配。结果如下:

  

  所以我们在匹配的时候一定要注意贪婪模式和非贪婪模式的区别。如果不确定匹配结果,可以将网页内容复制到sublime。首先尝试写一个正则表达式。正则表达式被写入python。

  编译方法:

  编译方式是对正则表达式的匹配模式进行预编译,然后生成缓存,这样缓存就可以直接用于后续的匹配,不需要每次匹配都重新编译,从而加快速度。

  一般情况下,只有当一个正则表达式被多次重复使用时,才需要使用compile方法提前编译,如果只使用一次,则没有必要。请看下图中使用compile方法提前编译和不使用compile方法的区别:

  

  group()和groups()的区别:

  groups 方法返回所有成功匹配的子组,并返回元组。group 方法返回所有匹配的对象。如果我们只想要子组,我们需要添加参数。请看下图两个结果的比较:

  

  5

  使用正则表达式匹配文章标题(article_title)

  正则表达式的写法和刚才一样,这里是findall方法:使用findall方法匹配所有符合要求的字符串。findall 方法返回一个列表。示例如下:

  

  然后我们可以使用 findall 方法将网页中所有匹配的内容匹配到列表中,然后通过 for 循环提取列表内容:

  

  6

  使用正则表达式匹配文章url (article_url)

  可以看到直接获取列表中的文章url得到的结果是一个相对路径,所以我们需要通过一些方法来完成路径。这里董瑶为大家介绍两种方法:

  首先是列表理解:

  

  第二种是使用正则表达式的 sub 或 subn 方法来替换字符串:

  7

  关于大小写匹配和换行符匹配

  有时我们在匹配时可能会出现不区分大小写的错误,那么匹配时如何不区分大小写呢?re 模块中的标志参数 I 用于忽略大小写匹配。用法如下:

  

  有时某些内容在匹配时涉及换行符,以及“。” 只能匹配除换行符以外的所有字符。如果要将换行符匹配在一起,则需要使用 re 模块中的标志参数 S。用法如下:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线