爬虫入门到精通-网页的解析(正则)
本文章属于爬虫入门到精通系统教程第五讲
在爬虫入门到精通第四讲中,我们了解了如何下载网页(http://mp.weixin.qq.com/s?__biz=MzU2OTAxNTcwMw==&mid=100000023&idx=1&sn=0c0ff48e9bfca19dca6c4ed5bad46e0a&chksm=7c846def4bf3e4f9bde83bc8aa966419022c86dea5db9a00918f3b0220f9432c38f3b991d44a#rd),这一节就是如何从下载的网页中获取我们想要的内容
html = u"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文章的标题</title>
</head>
<body>
<div id="app" class="container">
<h1>h1文字</h1>
<label for="input">Input</label>
<textarea id="input" rows="10" class="form-control">
</body>
</html>"""
我们要获取的html 如上所示,
假如我们要获取文章的标题这几个文字,那么我们应该怎么做呢?
我们只要能定位到它,也就能获取到它
那么,如何定位到它呢?
很简单,根据它两边的内容.
我们很简单的能发现 它 左边是<title> ,右边是</title>
所以,我们如何找到文章的标题这几个文字呢,只要左边是<title> ,右边是</title>,那么中间就是我们要找的
下面用程序写出来
可以看到我们正确匹配到了文章的标题,
我们首先来看
pattern = '<title>(.*?)</title>'
我们可以发现这就是我们上面讲的,左边是<title> ,右边是</title>,那么中间的(.*?)是什么呢?这其实是来用来声明我们要匹配的字符串是什么,这边我们用的是(.*?),表示我们要匹配的字符串可以是任何东西,没有格式要求。也就是俗称"万能匹配",大家可以下图的正则表达式语法,来解释下为什么 .*? 是万能匹配, .*? 外面的 () 又是什么鬼
string=html 表示我们当前要被匹配的是我们定义的html
最后flags=re.S 表示,(.*?)中的 . 可以匹配包括换行符(见下面表)
[0] 是取返回列表中的第一个,主要是方便演示
正则表达式语法(声明我们要匹配的字符串是什么格式的)
引用自 博客园
re中所有的flags解释
最后再来一个案例,还是上面的html,我们需要匹配的内容是h1文字,代码如下
本文使用notebook编写完成,全文在github上(https://github.com/kimg1234/pachong/blob/master/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8.ipynb)
总结
看完本篇文章后,你应该要:
学会最通用的一种正则表达式
re.findall('左右的字符串(.*?)右边的字符串',等待匹配的字符串,flags)
大家想深入了解正则表达式的话
请 先看这一篇 正则表达式30分钟入门教程
http://deerchao.net/tutorials/regex/regex.htm
再看这一篇 Regular expression operations
https://docs.python.org/2/library/re.html
- mac:在当前文件夹打开terminal终端
- 斯诺登研发黑客警报App上架 监测功能引发争议
- JMS + jboss EAP 6.2 示例
- Maven Compilation error [package org.testng.annotations does not exist]
- 查看jar包的jdk版本并降级
- ejb3: message drive bean(MDB)示例
- java提示找不到或无法加载主类
- 学Java有什么好方法?刻苦学技术让我最终成为自信的码农
- expect+scp传输文件发现文件丢失
- IBM WebSphere MQ 7.5基本用法
- QPS的计算
- Django----中间件详解
- linux 添加用户到sudo中
- 机器学习之白话adaboost元算法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一天一大 leet(二叉树中的最大路径和)难度:困难 DAY-21
- 一天一大 leet(把数字翻译成字符串)难度:中等 DAY-9
- 一天一大 leet(模式匹配)难度:中等 DAY-22
- 一天一大 leet(二进制求和)难度:简单 DAY-23
- xmake v2.3.7 发布, 新增 tinyc 和 emscripten 工具链支持
- 一天一大 leet(最接近的三数之和)难度:中等 DAY-24
- Django渲染模板
- 一天一大 leet(移除重复节点)难度:简单 DAY-26
- Spring Boot 项目瘦身指南,瘦到不可思议!
- BigData--Hadoop数据压缩
- 面试官问我什么是JMM
- django+nginx+gunicorn部署配置
- JVM的YGC,这次被它搞惨了!
- ubuntu修复linux和windows双系统下挂载ntfs硬盘出错问题
- 一天一大 leet(长度最小的子数组)难度:中等 DAY-28