前面我们已经能用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爬虫的时候,我们要综合分析网站,网站结构不同,我们采取的方法就不同,这需要我们灵活多变,摆脱惯性思维。