Python爬虫(三):正则表达式入门,爬取糗事百科笑话实例 - Go语言中文社区

Python爬虫(三):正则表达式入门,爬取糗事百科笑话实例


前面我们已经能用beautifulsoup库解析HTML页面并获得我们要的数据,但用beautifulsoup库有很多限制,有时候并不能达到理想的效果(文章中我将给出对比实例)。在这篇文章中我将介绍另外一种解析HTML页面的方法,利用正则表达式。

本文主要内容:

1.正则表达式介绍。

2.利用正则表达式爬取笑话。

3.正则表达式爬取结果与beautifulsoup爬取结果对比。

1.正则表达式介绍。

正则表达式,就是用一行语句代替一组语句,就像x+y=z可以代表1+1=2,2+2=4。表示一组具有某些特点的字符串(可以穷举,但很复杂)或者某种字符串组的简洁表达式。

正则表达式的有点便是简洁,“一行胜前言”。

正则表达式在文本处理中非常常用,例如:

        表达文本类型的特征(病毒,入侵等)

        同时查找和替换一组字符串

        匹配字符串对的全部或部分

正则表达式在爬虫中的使用则用于匹配特定特征的字符串,提取出或删除某些字符串。

正则表达式的语法:

Re库:

在Python中要实现正则表达式相关功能则需引进Re库。

Re库是Python的标准库,主要用于字符串匹配。需要使用时直接通过 import re 调用即可。

具体的方法介绍以及运用实例请参考文档:

链接:https://pan.baidu.com/s/1XbZ9eGkJvDkkFueYnI7S7A 密码:s5ih

2.利用正则表达式爬取笑话。

首先我选取了糗事百科的文字笑话专栏:

https://www.qiushibaike.com/text/page/1/

1.爬取代码框架。

def getHTMLText(url):
    #使用Requests库获得网页信息
 
def fillUnivList(ulist, html):
    #使用Beautifulsoup库解析网页。
def printUnivList(ulist):
    #打印结果
    
def main():
    uinfo = []
    u = 'https://www.qiushibaike.com/text/page/1/'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo)

2.获得网页链接(使用通用框架)。

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        #r.encoding = r.apparent_encoding
        return r.text
    except:
        print("faile")
        return ""

3.分析网页结构,使用正则表达式匹配。

打开网站,查看网页结构:

发现我们需要的笑话在'<div  class=article block untagged mb15 typs_hot'>标签下的<div class=content>标签下的<span>标签。

我们此处结合beautifulsoup库与正则表达式共同解析网页,提取信息。

代码及注解如下:

def fill2(ulist,html):
    soup = BeautifulSoup(html, "html.parser") #使用Beautifulsoup熬制一锅“汤”
    for tr in soup.find_all('div','article block untagged mb15 typs_hot'): #找到HTML下所有的<div class=article block untagged mb15 typs_hot>标签,分别对每个标签内容进行操作。
        if isinstance(tr, bs4.element.Tag): #判断是否为html标签
            tds = tr.find('div','content')  #找到所有的<div class=content>标签
            tdss=tds('span') 
            reg = re.compile('<[^>]*>') #使用正则表达式去掉标签
            text=reg.sub('',str(tdss))
            regg = re.compile('\[|\]|\n') #使用正则表达式去掉[]和换行符
            text=regg.sub('',text)
            ulist.append(text)

3.打印结果。

打印结果即遍历ulist列表,用一个for循环分别打印每一行,如下:

def printUnivList(ulist):
    i=0
    for u in ulist:
        i=i+1
        print("{}.{}".format(i,u))

4.完整代码。

# -*- coding: utf-8 -*-
"""
Created on Wed Aug  8 17:20:34 2018

@author: Administrator
"""

import requests
from bs4 import BeautifulSoup
import bs4
import re
def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        #r.encoding = r.apparent_encoding
        return r.text
    except:
        print("faile")
        return ""
def printUnivList(ulist):
    i=0
    for u in ulist:
        i=i+1
        print("{}.{}".format(i,u))

def fill2(ulist,html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find_all('div','article block untagged mb15 typs_hot'):
        if isinstance(tr, bs4.element.Tag):
            tds = tr.find('div','content')
            tdss=tds('span')
            reg = re.compile('<[^>]*>')
            text=reg.sub('',str(tdss))
            regg = re.compile('\[|\]|\n')
            text=regg.sub('',text)
            ulist.append(text)
def main():
    ulist=[]
    url='https://www.qiushibaike.com/text/page/1/'
    html=getHTMLText(url)
    fill2(ulist,html)
    printUnivList(ulist)
main()

5.运行结果。

3.正则表达式爬取结果与beautifulsoup爬取结果对比。

肯定有人会奇怪,为什么我们在分析网页结构的时候不直接用beautifulsoup库的  .string 方法直接获取笑话。博主在做的时候正是因为那种方法遇到了问题才改用正则表达式的。

下面我们把分析网页,提取信息代码换成下面:

def fill2(ulist,html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find_all('div','article block untagged mb15 typs_hot'):
        if isinstance(tr, bs4.element.Tag):
            tds = tr.find('div','content')
            tdss=tds('span')
            ulist.append(tdss[0].string)

完全使用beautifulsoup库,我们得到的结果如下:

对照结果,发现有的成功提取了,有的并未提取出,所以加入正则表达式是必要的。

综上,在我们使用Python爬虫的时候,我们要综合分析网站,网站结构不同,我们采取的方法就不同,这需要我们灵活多变,摆脱惯性思维。

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_41137248/article/details/81537093
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-25 01:36:30
  • 阅读 ( 1104 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢