上面链接爬虫只是能将我们所需的网页下载下来,但是,我们没办法得到我们想要的数据。因此,我们只有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. x战警 天启高清完整版下载

    天启出生于埃及第一王朝,是地球上最古老.最强大的变种人沙巴泊,曾拥有无数信众,但后来遭人背叛,被人活埋.几千年后,强大无匹而且永生不朽的天启从数千年的深埋中获释,愤怒的他发现同类不再被视为神祇,他对人 ...

  2. iOS开发之如何修改导航栏的内容

    导航栏的内容由栈顶控制器的navigationItem属性决定. UINavigationItem有以下属性影响着导航栏的内容(通常在子控制器中viewDidLoad方法中调用这些方法): 左上角的返 ...

  3. winow7安装django 1.9.1

    1.下载django https://www.djangoproject.com/download/ 2.解压,并到该目录下 执行 python setup.py install 3.验证是否安装成功 ...

  4. CSS.06 -- 尚合网页模拟

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. node.js平台下,利用cookie实现记住密码登陆(Express+Ejs+Mysql)

    本博文需有node.js+express+mysql入门基础,若基础薄弱,可参考博主的其他几篇node.就是博文: 1.下载Mysql数据库,安装并配置 创建用户表供登录使用: 2.node.js平台 ...

  6. 数据库DDL操作

    DDL1. 数据库* 查看所有数据库:SHOW DATABASES* 切换(选择要操作的)数据库:USE 数据库名* 创建数据库:CREATE DATABASE [IF NOT EXISTS] myd ...

  7. Apache Mina入门实例

    一.mina是啥 ApacheMINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可扩展性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的 ...

  8. 读书笔记 effective c++ Item 42 理解typename的两种意义

    1. class和typename意义相同的例子 问题:在下面的模板声明中class和typename的区别是什么? template<class T> class Widget; // ...

  9. Dubbo配置方式详解

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是阿里巴巴 SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次 ...

  10. ArcGIS API for JavaScript 4.2学习笔记[30] 点和线高程查询(第八章完结)

    终于到最后一篇了,可喜可贺. 本例先说明了如何进行单点的高程差分析,然后说明了道路的起伏分析.前者很直观地比较了两个年份的高程数据之间的差值,体现山区的高程变化(有啥用啊?)后者,一条路上的起点终点起 ...