最近因项目需要用到python处理网页,因此学习相关知识。下面程序使用python抓取网页并提取信息,具体内容如下:

#------------------------------------------------------------------------------

import urllib2 # extensible library for opening URLs
import re # regular expression module #------------------------------------------------------------------------------
def main():
userMainUrl = "http://www.songtaste.com/user/351979/"
req = urllib2.Request(userMainUrl) # request
resp = urllib2.urlopen(req) # response
respHtml = resp.read() # read html
print "respHtml =", respHtml
#<h1 class="hluser">crifan</h1>
foundH1user = re.search(r'<h1\s+?class="h1user">(?P<h1user>.+?)</h1>', respHtml)
print "foundHluser =", foundH1user
if foundH1user:
h1user = foundH1user.group("h1user")
print "hluser=", h1user ###################################################################################
if __name__=='__main__':
main()

本程序实现目的,从http://www.songtaste.com/user/351979/网页源码中找到

<h1 class="hluser">crifan</h1>

再从上面的格式中提取“crifan”。

从网络中读取网页,需要2个步骤:向网页服务器请求和服务器响应。下面对程序核心的部分进行解析,如下:
foundH1user = re.search(r'<h1\s+?class="h1user">(?P<h1user>.+?)</h1>', respHtml)

本语句使用正则表达式进行匹配字符串“<h1 class="hluser">crifan</h1>”。将<h1>与</h1>之间的内容归为一个group,group名为h1user。
注意 “h1user”中‘1’是数字‘1’,不是字母‘l’
程序中涉及到相关知识如下:

1、
re.search

re.search(patternstringflags=0)

Scan through string looking for the first location where the regular expression pattern produces a match, and return a corresponding MatchObject instance. Return None if no position in the string matches the pattern; note that this is different from finding a zero-length match at some point in the string.

class re.MatchObject

Match objects always have a boolean value of True.

Since match() and search() return None when there is no match, you can test whether there was a match with a simple if statement:

match = re.search(pattern, string)

if match:

process(match)

2、group([group1...])

Match objects support the following methods and attributes:

group([group1...])

Returns one or more subgroups of the match. If there is a single argument, the result is a single string; if there are multiple arguments, the result is a tuple with one item per argument. Without arguments, group1 defaults to zero (the whole match is returned). If a groupN argument is zero, the corresponding return value is the entire matching string; if it is in the inclusive range [1..99], it is the string matching the corresponding parenthesized group. If a group number is negative or larger than the number of groups defined in the pattern, an IndexError exception is raised. If a group is contained in a part of the pattern that did not match, the corresponding result is None. If a group is contained in a part of the pattern that matched multiple times, the last match is returned.

3、(?P<name>...)

(?P<name>...),用于对group命名,group名为name,从而可以通过group('name'),实现对此group进行访问。如程序中

foundH1user.group("h1user")

其中foundH1user为MatchObject instance,h1user为group名

与正常的括号类似,但是按group匹配的子串可通过象征性的group名name访问。group名必须是有效的Python标识符,每个组名在正则表达式中只能定义一次。具有symbolic group name的组也是一个有编号的组,就好像这个group没有被命名一样

Similar to regular parentheses, but the substring matched by the group is accessible via the symbolic group name name. Group names must be valid Python identifiers, and each group name must be defined only once within a regular expression. A symbolic group is also a numbered group, just as if the group were not named.

4、程序中使用的正则表达式符号

常用的元字符

\s      匹配任意的空白符

.        匹配除换行符以外的任意字符

常用的限定符

+       重复一次或更多次

?       重复零次或一次

由正则表达式的符号含义可知,程序中 "\s+?" 完全可以用 "\s+" 或 ”\s?"替代

参考资料:

1、http://www.crifan.com/crawl_website_html_and_extract_info_using_python/

2、https://docs.python.org/2/library/re.html#re.MatchObject

3、http://deerchao.net/tutorials/regex/regex.htm

Python 抓取网页并提取信息(程序详解)的更多相关文章

  1. 我的第一个爬虫程序:利用Python抓取网页上的信息

    题外话 我第一次听说Python是在大二的时候,那个时候C语言都没有学好,于是就没有心思学其他的编程语言.现在,我的毕业设计要用到爬虫技术,在网上搜索了一下,Python语言在爬虫技术这方面获得一致好 ...

  2. (转)如何用python抓取网页并提取数据

    最近一直在学这部分,今日发现一篇好文,虽然不详细,但是轮廓是出来了: 来自crifan:http://www.crifan.com/crawl_website_html_and_extract_inf ...

  3. 用python抓取智联招聘信息并存入excel

    用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...

  4. python抓取网页例子

    python抓取网页例子 最近在学习python,刚刚完成了一个网页抓取的例子,通过python抓取全世界所有的学校以及学院的数据,并存为xml文件.数据源是人人网. 因为刚学习python,写的代码 ...

  5. 使用python抓取58手机维修信息

    之前在ququ的博客上看到说 python 中的BeautifulSoup 挺好玩的,今天下午果断下载下来,看了下api,挺好用的,完了2把,不错. 晚上写了一个使用python抓取58手机维修信息的 ...

  6. python抓取网页引用的模块和类

    在Python3.x中,我们可以使用urlib这个组件抓取网页,urllib是一个URL处理包,这个包中集合了一些处理URL的模块,如下:1.urllib.request模块用来打开和读取URLs:2 ...

  7. Python抓取网页中的图片到本地

    今天在网上找了个从网页中通过图片URL,抓取图片并保存到本地的例子: #!/usr/bin/env python # -*- coding:utf- -*- # Author: xixihuang # ...

  8. python抓取链家房源信息(二)

    试着用scrapy将之前写的抓取链家网信息的重新写了写 然后先是用了第一页的网页作为测试,调试代码,然后发现总是抓取的时候遇见了 类似于这样的问题,并且抓取不到信息 2017-03-28 17:52: ...

  9. python抓取网页中图片并保存到本地

    #-*-coding:utf-8-*- import os import uuid import urllib2 import cookielib '''获取文件后缀名''' def get_file ...

随机推荐

  1. j-link或者swd调试

    两种 一.JTAG调试(5针), 二.SWD调试(2针), 在JTAG/SWD模式设置库函数 (在文件stm32f10x_gpio.c中): void GPIO_PinRemapConfig(uint ...

  2. 隐马尔可夫模型(Hidden Markov Model,HMM)

    介绍 崔晓源 翻译 我们通常都习惯寻找一个事物在一段时间里的变化规律.在很多领域我们都希望找到这个规律,比如计算机中的指令顺序,句子中的词顺序和语音中的词顺序等等.一个最适用的例子就是天气的预测. 首 ...

  3. Keepalived+Redis高可用部署(第二版)

    更新 20150625 脚本由5个减少为4个,sh脚本指令做了精简. 修改了另外3个脚本,在日志里增加了日期显示. 新增redis数据类型,持久化,主从同步简介. 新增hiredis简介. 新增c语言 ...

  4. Android新旧版本Notification

    Android新旧版本Notification 在notification.setLatestEventInfo() 过时了 以前: NotificationManager mn = (Notific ...

  5. 9.29判断变量x是奇数还是偶数

    方法一: package qqq; public class Jiou { public static void main(String[] args) { // TODO Auto-generate ...

  6. cocoaPods 的安装和使用

    参考:http://www.360doc.com/content/14/0309/10/11029609_358970353.shtml

  7. 同 一个页面,不同请求路径,如何根据实际场景写JS

    场景:使用同一个“添加群成员”的页面来操作 建群页面:建群成功后,返回查看群成员页面.在建群过程中直接添加群成员并返回一个群名称的参数. 添加群成员页面:在巳有群内添加群成员,添加成功后,返回查看群成 ...

  8. Chrome DevTools good good study day day up

    Chrome DevTools 官方页面 https://developer.chrome.com/devtools

  9. Eclipse SVN插件与TortoiseSVN的对应关系及下载链接

    Eclipse SVN 插件与TortoiseSVN对应关系 Eclipse 3.2/Callisto, 3.3/Europa, 3.4/Ganymede, 3.5/Galileo, 3.6/Heli ...

  10. cygwin-介绍-安装

    初学linux时,最头疼的是,因为windows和linux各有优点,各有用途,所以只能麻烦的在两者之间切换,不断的重启.开机时也麻烦,因为初学者大多数使用windows,装了linux后,开机会自动 ...