上面链接爬虫只是能将我们所需的网页下载下来,但是,我们没办法得到我们想要的数据。因此,我们只有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的更多相关文章

随机推荐

  1. BZOJ4403 序列统计—Lucas你好

    绝对是全网写的最详细的一篇题解  题目:序列统计 代码难度:简单 思维难度:提高+-省选 讲下题面:给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案 ...

  2. C# .NET 逻辑层的框架设计

    前述:在我的了解中,一个大项目的逻辑层是不可捉摸的,对于不同项目或场景都是不同的逻辑.先说明,我的想法是对逻辑层类结构,以及如何操作逻辑的方法进行抽象的封装.并且考虑将不同类,或者不同程序集中的逻辑方 ...

  3. java学习笔记 --- 多态

    一.多态 (1)定义:同一个对象在不同时刻体现出来的不同状态.父类的引用或者接口的引用指向了自己的子类对象.   Dog d = new Dog();//Dog对象的类型是Dog类型.  Animal ...

  4. 线程同步synchronized,Class与Object

    synchronized (class):class类的同步,同步的时候会同步整个class 与 synchronized (Object):Object的同步,只对其中的对象同步 如下:对类B中的同 ...

  5. 【Java基础】 Java动态代理机制

    在Java的动态代理机制中,有两个重要的类.一个是InvocationHandler,另一个是Proxy. InvocationHandler:每一个动态代理类都必须要实现InvocationHand ...

  6. Linux批量清理多个文件内容而不删除文件

    清理单个文件,可以这样:echo > myLog.log 但是,如果我要清理一堆文件,比如在/logs目录下面的所有以.log结尾的文件的内容,而不删除文件,该如何操作呢? 我一开始的语句是这样 ...

  7. FB,Flash,as3 Bug集

    一.Flash builder 报错 当导入3.0的项目时运行出现如下错误: 进程已终止,没有建立到调试器的连接.error while loading initial content 启动命令详细信 ...

  8. Oracle DBA管理包脚本系列(二)

    该系列脚本结合日常工作,方便DBA做数据管理.迁移.同步等功能,以下为该系列的脚本,按照功能划分不同的包.功能有如下: 1)数据库对象管理(添加.修改.删除.禁用/启用.编译.去重复.闪回.文件读写. ...

  9. ReactJS入门2:组件状态

    React组件可以简单看做是包含props和states的函数. 上一节总结了创建新组建和数据属性的传递.本节主要讲解组件的状态. React认为UI是不同状态的展现.在React中,开发者只需更新组 ...

  10. Centos/RHEL上查看主板型号

    老是搞忘记,专门做个记录: [root@media ~]# dmidecode | grep "Product Name" Product Name: To be filled b ...