Scraping_regex
上面链接爬虫只是能将我们所需的网页下载下来,但是,我们没办法得到我们想要的数据。因此,我们只有URL管理器和URL下载器是不足以组成一个完整的网络爬虫的。我们还需要URL解析器,对数据进行提取。
数据抓取(Scraping)有三种方式:1.正则表达式;2.第三方包——BeautifulSoup;3.lxml模块
1.正则表达式(regex)方法。
'''
数据抓取:从网页中抓取一些感兴趣的数据,然后实现某些事情。主要有三种方法——正则;BeautifulSoup模块和lxml模块。
'''
# 正则表达式
# 帮助文档https://docs.python.org/2/howto/regex.html
import urllib2
import re
def download(url, user_agent= "wswp", num_retries= 2):
print "Download :", url
headers= {"User_agent": user_agent}
request= urllib2.Request(url, headers=headers)
try:
html= urllib2.urlopen(request).read()
except urllib2.URLError as e:
print "Download Error :", e.reason
html= None
if num_retries> 0:
if hasattr(e,"code") and 500<= e.code< 600:
return download(url, user_agent, num_retries-1)
return html
if __name__ == "__main__":
url = "http://example.webscraping.com/view/United-Kingdom-239"
html = download(url)
kingdom = re.findall('<td class="w2p_fw">(.*?)</td>',html)
# print kingdom
# 只提取面积属性
kingdom_square_1 = re.findall('<td class="w2p_fw">(.*?)</td>', html)[1]
print kingdom_square_1
# 上面例子只能抓取固定不变的网页中的面积,但是,如果网页发生改变,第二行不再是面积时,就不能抓取到了。所以,下面做一些改进。
'''
<tr id="places_area__row"><td class="w2p_fl"><label for="places_area" id="places_area__label">Area: </label></td><td class="w2p_fw">244,820 square kilometres</td><td class="w2p_fc"></td></tr>
'''
# 将其父元素<tr>加入进来,由于该元素有ID属性,所以,应该是唯一的。
kingdom_square_2 = re.findall('<tr id="places_area__row"><td class="w2p_fl"><label for="places_area" id="places_area__label">Area: </label></td><td class="w2p_fw">(.*?)</td><td class="w2p_fc"></td></tr>', html)
print kingdom_square_2 # 上一个版本虽然比上一个的要精准一些,但是也会遇到一些问题,比如:双引号变为单引号,<td>标签之间添加多余的空格,或者变更area_label等
kingdom_square_3 = re.findall('<tr id="places_area__row">.*?<td\s*class=["\']w2p_fw["\']>(.*?)</td>', html)
print kingdom_square_3 # 总结:正则表达式比较便捷,但是这种方式太过脆弱,只能抓取静态的网页,容易在网页更新后出现问题。
Scraping_regex的更多相关文章
随机推荐
- JS调用APP
/* 500ms内,本机有应用程序能解析对应的协议并打开程序,调用该应用: 如果本机没有应用程序能解析该协议或者500ms内没有打开这个程序, 则执行setTimeout里面的function,跳转到 ...
- C#生成漂亮验证码完整代码类
using System;using System.Web;using System.Drawing;using System.Security.Cryptography; namespace Dot ...
- Java之路——环境配置与编译运行
本文大纲 一.开篇 二.JDK下载 三.JDK安装 四.环境配置 五.初识Java编译 六.Java与Javac 七.第一个Java程序 八.总结 九.参考资料 一.开篇 通过对之前Java之路的了解 ...
- Linux之例行(任务调度)
一. 例行命令之at 1.1 at 仅执行一次就从Linux任务中取消 1.2 at 指令可以将工作命令写入工作记录文件,工作记录文件默认存放在/var/spool/at目录内 1.3 at 工作 ...
- trigger和triggerhandler的区别
1. trigger会触发默认行为2. trigger会触发所有元素的模拟事件,而triggerHandler只触发一次3. trigger可以链式操作,triggerHandler不能4. trig ...
- 【2017-03-31】JS-DOM操作:操作属性、彩虹导航栏、定时器、操作内容、创建元素并添加、操作相关元素
一.操作属性 1.什么是属性: <div class="div" id="div1" style="" ></div> ...
- Python之路-正则表达式
作业一:整理正则表达式博客 正则表通常被用来检索.替换那些符合某个模式(规则)的文本,为了提取对自己有用的信息,由命令解释执行:而通配符和命令是同一级别,为了提示处理效率,直接由shell解释执行. ...
- MySQL flashback 功能
1. 简介 mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据.在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos).比如忘了带wh ...
- ATM取款小项目
项目要求: 1.用户需要从控制台输入账号密码,账号或者密码不正确报异常 2.每日取款的金额有限制(100,30000),否则报异常 3.每次取款都要有记录,并在下一次取款时显示出来 思路: 1.先在& ...
- Hibernate三种状态及生命周期
临时状态---使用new操作符的对象不能立刻持久,也就是说没有任何跟数据库相关的行为, 只要应用不再使用这些对象,状态会丢失,并由垃圾回收机制回收持久对象---持久实例是具有数据库标识的实例.统一又S ...