使用正则表达式解析网页是Python的一个擅长的领域。如果还想更加深入地学习正则表达式,或者在平时经常用到正则表达式,可以进入Regular Expression 101网站学习,网站地址为 https://regex101.com/ 。

接下来会讲解爬虫抓取网页后,Python如何用正则表达式进行网页解析。

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的特定字符和这些特定字符的组合组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。举一个简单的例子,假设字符串为'我们爱吃苹果,也爱吃香蕉',我们需要提取其中的水果,用正则表达式匹配'爱吃'后面的内容就可以找到'苹果'和'香蕉'了。

为了利于我们改善优化接下来的内容贴合度,可以填写下您的Python掌握程度。

您的Python熟练程度 (单选)

0

0%

小白

0

0%

入门

0

0%

中等

0

0%

大牛

投票

在提取网页中的数据时,我们可以先把源代码变成字符串,然后用正则表达式匹配想要的数据。刚刚接触正则表达式时可能会觉得晦涩难懂,但是使用正则表达式可以迅速地用极简单的方式达到字符串的复杂控制。

表5-1是常见的正则字符和含义。如果想了解更为详细的正则表达式文档,可以访问: https://docs.python.org/3/library/re.html 。

表5-1 常见的正则字符和含义

首先,我们介绍Python正则表达式的3种方法,分别是re.match、re.search和re.findall。

re.match方法

re.match的意思是从字符串起始位置匹配一个模式,如果从起始位置匹配不了,match()就返回none。

re.match的语法为re.match(pattern,string,flags=0),其中pattern是正则表达式,包含一些特殊的字符,string为要匹配的字符串,flags用来控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。

例如,我们想使用两个字符串匹配并找到匹配的位置,可以使用:

import re

m = re.match('www', 'www.santostang.com')

print ("匹配的结果: ", m)

print ("匹配的起始与终点: ", m.span())

print ("匹配的起始位置: ", m.start())

print ("匹配的终点位置: ", m.end())

得到的结果为:

匹配的结果: <_sre.sre_match object>

匹配的起始与终点: (0,3)

匹配的起始位置: 0

匹配的终点位置: 3

上述例子中的pattern只是一个字符串,我们也可以把pattern改成正则表达式,从而匹配具有一定模式的字符串,例如:

line = "Fat cats are smarter than dogs, is it right?"

m = re.match( r'(.*) are (.*?) ', line)

print ('匹配的整句话', m.group(0))

print ('匹配的第一个结果', m.group(1))

print ('匹配的第二个结果', m.group(2))

print ('匹配的结果列表', m.groups())

得到的结果为:

匹配的整句话Fat cats are smarter

匹配的第一个结果Fat cats

匹配的第二个结果smarter

匹配的结果列表('Fat cats','smarter')

为什么这里(.*)匹配了Fat cat,而(.*?)只匹配了smarter呢?

这就涉及正则表达式匹配中默认的贪婪模式总是尝试匹配尽可能多的字符。在上述例子中,(.*)are会尽量匹配最多的字符,因此把Fat cat匹配了。非贪婪模式则相反,总是尝试匹配尽可能少的字符,are(.*?)会尽量匹配尽量少的字符,因此把smarter匹配了。

为什么要在match的模式前加上r呢?

r'(.*)are(.*?).*'前面的r意思是raw string,代表纯粹的字符串,使用它就不会对引号里面的反斜杠'\'进行特殊处理。要解释清楚,可以举个例子。例如:

print ('Hello\World\nPython')

结果为:

Hello\World

Python

可以看到里面的'\n'已转义为换行符,但是'\W'没有转义,这是因为'\W'在字符串转义中没有对应特殊字符。如果现在需要不对'\n'转义,原封不动输出'Hello\World\nPython'呢?

第一种方法我们可以写成

print ('Hello\World\\nPython')

两个反斜杠的“字符串转义”会把"\\"转义为"\"。

第二种方法是使用r'…',原始字符串的方法,不会对引号里面的反斜杠'\'进行特殊处理。

print (r'Hello\World\nPython')

以上是字符串转义中raw string的用法,那么正则表达式的转义怎么用呢?

import re

string = r'2\7'

m = re.match('(\d+)\\\\', string)

print (m.group(1)) # 结果为:2

n = re.match(r'(\d+)\\', string)

print (n.group(1)) # 结果为:2

首先需要知道的是,正则表达式字符串需要经过两次转义,这两次分别是上面的“字符串转义”和“正则转义”

正则表达式如果不用r'…'方法的话,就需要进行“字符串转义”和“正则转义”。在上述案例中,需要匹配r'2\7'中的字符"\",使用编程语言表示的正则表达式里就需要4个反斜杠"\\\\":前两个反斜杠"\\"和后两个反斜杠"\\"各自在字符串转义成一个反斜杠"/",所以4个反斜杠"\\\\"就转义成了两个反斜"\\",这两个反斜杠"\\"最终在正则表达式转义成一个反斜杠"\"。

如果使用r'…'方法的话,不用进行字符串转义,直接进入第二步“正则转义”,在正则转义中"\\"被转义为了"\",这个例子中可以使用r"\\"表示。

5.1.2 re.search方法

re.match只能从字符串的起始位置进行匹配,而re.search扫描整个字符串并返回第一个成功的匹配,例如:

import re

m_match = re.match('com', 'www.santostang.com')

m_search = re.search('com', 'www.santostang.com')

print (m_match)

print (m_search)

得到结果为:

None

其他方面re.search与re.match一样,可以参照上面的re.match来操作。

re.findall方法

上述match和search方法中,我们只能找到一个匹配所写的模式,而findall可以找到所有的匹配,例如:

import re

m_match = re.match('[0-9]+', '12345 is the first number, 23456 is the sencond')

m_search = re.search('[0-9]+', 'The first number is 12345, 23456 is the sencond')

m_findall = re.findall('[0-9]+', '12345 is the first number, 23456 is the sencond')

print (m_match.group())

print (m_search.group())

print (m_findall)

上述代码的'[0-9]+'表示任意长度的数字,然后在后面的字符串中进行匹配。

运行上述代码,得到的结果是:

12345

12345

['12345','23456']

findall与match、search不同的是,findall能够找到所有匹配的结果,并且以列表的形式返回。当爬取博客文章的标题时,如果提取的不只是一个标题,而是所有标题,就可以用findall。

博客的文章标题部分的HTML代码如下:

Hello world!

07月04日

Python 网络爬虫

1条评论

抓取博客主页所有文章标题的Python代码如下:

import requests

import re

link = "http://www.santostang.com/"

headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}

r = requests.get(link, headers= headers)

html = r.text

title_list = re.findall('

(.*?)

',html)

print (title_list)

以上代码用于提取博客主页上所有文章的标题,这里使用findall匹配,使用'

(.*?)

'正则表示式表示对所有满足此条件的结果。带有括号,表示只提取其中的(.*?)部分。运行代码,得到的结果是:

['4.3通过selenium模拟浏览器抓取','4.2解析真实地址抓取','第四章-动态网页抓取(解析真实地址+selenium)','《网络爬虫:从入门到实践》一书勘误','Hello world!']

这样就把所有的标题提取出来了。

python爬虫自学网站_Python爬虫3步曲:5分钟学习用Python解析网页相关推荐

  1. python爬虫自学网站_python爬虫学习 爬取幽默笑话网站

    这篇文章主要介绍了python爬虫爬取幽默笑话网站,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 爬取网站为:http://xiaohua.zol. ...

  2. python爬虫自学路线_python 爬虫学习路线:从入门到进阶

    大家好,我是凉拌 今天给大家详解一下我的爬虫学习路线. 对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情.比如有的人则认为先要掌握网页的知识,遂开始 HTML\CSS,结果入了前端的坑,浪费了 ...

  3. beautifulsoup网页爬虫解析_Python爬虫3步曲:5分钟学习用Python解析网页

    使用正则表达式解析网页是Python的一个擅长的领域.如果还想更加深入地学习正则表达式,或者在平时经常用到正则表达式,可以进入Regular Expression 101网站学习,网站地址为 http ...

  4. python爬虫登录网站_python爬虫学习,使用requests库来实现模拟登录4399小游戏网站。...

    1.首先分析请求,打开4399网站. image 右键检查元素或者F12打开开发者工具.然后找到network选项, image 这里最好勾选perserve log 选项,用来保存请求日志.这时我们 ...

  5. python就业形势不好_Python就业前景好不好?为什么学完Python找不到工作?

    近几年,Python从一门默默无闻的编程语言突然蹿红,引来不少编程学习者的青睐.一方面是Python在开发里的广泛使用和流行,另一方面是许多求职者的困惑,Python就业前景好不好?为什么学完Pyth ...

  6. python就业前景不好_Python就业前景好不好?为什么学完Python找不到工作?

    近几年,Python从一门默默无闻的编程语言突然蹿红,引来不少编程学习者的青睐.一方面是Python在开发里的广泛使用和流行,另一方面是许多求职者的困惑,Python就业前景好不好?为什么学完Pyth ...

  7. python爬虫捕鱼网站_Python爬虫从太平洋地震工程研究中心数据库自动下载地震波时程...

    python app开发自动捕鱼" 引子-- 最近小编在沉迷捕鱼之余,扫到了某问答网站里的一个网友提问的标题叫做"Python真的有那么神吗?",各位被邀嘉宾们针对最近P ...

  8. python模拟登录网站_Python爬虫实战之(四)| 模拟登录京东商城

    作者:xiaoyu 微信公众号:Python数据科学 知乎:Python数据分析师 前两篇和大家分享了爬虫中http的一些概念和使用方法,基础篇我们主要介绍了http的请求头,高级篇我们主要介绍了co ...

  9. python模拟登录网站_Python爬虫之模拟登录wechat

    不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一起.既然它这么重要,如果我们可以利用爬虫模拟登录,是不是就意味着我们可以获取这些信息 ...

最新文章

  1. 如何用JNI技术提高Java的性能详解
  2. 最强python技术前沿!什么是python怎么学?通过这篇文字就知道了
  3. 典型问题分析(十五)
  4. Android EditText回车不换行
  5. 131125 - 关于对“一次元”、“二次元”、“三次元”的兴趣变化的奇思妙想
  6. 流控制、FlowControl
  7. django-allauth定制模板(转载)
  8. 【C++ Priemr | 15】构造函数与拷贝控制
  9. ajax异步注册代码,基于AJAX用户注册信息异步校验
  10. 如何删除github上的文件
  11. MyBatis学习总结[5]-动态 SQL
  12. 罗格斯大学计算机科学排名,罗格斯大学计算机工程硕士专业排名读完这篇立即秒懂...
  13. 2014年十大云计算发展趋势分析及预测
  14. linux备份文件命令
  15. linux 加速度传感器数据获取,Android传感器SensorEventListener之加速度传感器
  16. 金额保留小数点后两位方法
  17. 股权转让项目:厦门古龙温泉山庄开发有限公司60%股权转让
  18. java读取cmyk_用于检测CMYK图像的JAI ImageIO的纯Java替代品
  19. 基于MATLAB的GMSK调制解调系统的设计仿真
  20. 笔记2:VC++ socket通信实例

热门文章

  1. 修改Kali Linux终端历史记录大小
  2. XamarinEssentials教程首选项Preferences判断项目是否存在
  3. Swift3.0语言教程使用URL字符串
  4. aforge videoresolution获取的相机像素不全_新手做视觉系统,如何选择合适的相机?...
  5. pip无法更新_TensorFlow 2.0开发者测试版发布!每晚更新
  6. win10商店下载位置_开始菜单终变身但仍不完美!用这些利器让Win10改头换面吧...
  7. mac电脑配置java环境变量_教你在Mac系统中配置JAVA环境变量的方法
  8. Unity中那些事半功倍的好插件
  9. 一个模型通杀8大视觉任务,一句话生成图像、视频、P图、视频处理...都能行 | MSRA北大出品...
  10. 30分钟从工作电脑入侵公司内网!Win11:更新强制要求有TPM2.0,知道为啥了吧?...