Python 抓取网页并提取信息(程序详解)
最近因项目需要用到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(pattern, string, flags=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 抓取网页并提取信息(程序详解)的更多相关文章
- 我的第一个爬虫程序:利用Python抓取网页上的信息
题外话 我第一次听说Python是在大二的时候,那个时候C语言都没有学好,于是就没有心思学其他的编程语言.现在,我的毕业设计要用到爬虫技术,在网上搜索了一下,Python语言在爬虫技术这方面获得一致好 ...
- (转)如何用python抓取网页并提取数据
最近一直在学这部分,今日发现一篇好文,虽然不详细,但是轮廓是出来了: 来自crifan:http://www.crifan.com/crawl_website_html_and_extract_inf ...
- 用python抓取智联招聘信息并存入excel
用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...
- python抓取网页例子
python抓取网页例子 最近在学习python,刚刚完成了一个网页抓取的例子,通过python抓取全世界所有的学校以及学院的数据,并存为xml文件.数据源是人人网. 因为刚学习python,写的代码 ...
- 使用python抓取58手机维修信息
之前在ququ的博客上看到说 python 中的BeautifulSoup 挺好玩的,今天下午果断下载下来,看了下api,挺好用的,完了2把,不错. 晚上写了一个使用python抓取58手机维修信息的 ...
- python抓取网页引用的模块和类
在Python3.x中,我们可以使用urlib这个组件抓取网页,urllib是一个URL处理包,这个包中集合了一些处理URL的模块,如下:1.urllib.request模块用来打开和读取URLs:2 ...
- Python抓取网页中的图片到本地
今天在网上找了个从网页中通过图片URL,抓取图片并保存到本地的例子: #!/usr/bin/env python # -*- coding:utf- -*- # Author: xixihuang # ...
- python抓取链家房源信息(二)
试着用scrapy将之前写的抓取链家网信息的重新写了写 然后先是用了第一页的网页作为测试,调试代码,然后发现总是抓取的时候遇见了 类似于这样的问题,并且抓取不到信息 2017-03-28 17:52: ...
- python抓取网页中图片并保存到本地
#-*-coding:utf-8-*- import os import uuid import urllib2 import cookielib '''获取文件后缀名''' def get_file ...
随机推荐
- Matlab中的向量
1. 向量的创建 1)直接输入: 行向量:a=[1,2,3,4,5] 列向量:a=[1;2;3;4;5] 2)用“:”生成向量 a=J:K 生成的行向量是a=[J,J+1,…, ...
- doc2vec使用说明(一)gensim工具包TaggedLineDocument
gensim 是处理文本的很强大的工具包,基于python环境下: 1.gensim可以做什么? 它可以完成的任务,参加gensim 主页API中给出的介绍,链接如下: http://radimreh ...
- Android开发之补间动画、XML方式定义补间动画
四种补间动画: 1.透明: 2.缩放: 3.位移: 4.旋转: //点击按钮 实现iv 透明的效果 动画 public void click1(View v) { //1.0意味着着完全不透明 0.0 ...
- python环境搭建-Linux系统下python2.6.6升级python3.5.2步骤
[root@template ~]# python -v # /usr/lib64/python2.6/encodings/utf_8.pyc matches /usr/lib64/python2.6 ...
- 开发错误记录8:Unable to instantiate application com
开发错误记录8:Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication 这是因为在And ...
- ie-css3.htc 可以让IE低版本浏览器支持CSS3 的一个小工具
ie-css3.htc 先说道说道这斯是弄啥嘞 ie-css3.htc是一个可以让IE浏览器支持部份CSS3属性的htc文件,不只是box-shadow,它还可以让你的IE浏览器支持圆角属性borde ...
- Java 日期比较以及得到前后一天
/** * 比较两个指定时间,结果为0 表示相同,< 0 则表示第一个时间早于第二个时间 * @param firstDay * @param secondDay * @return */ pu ...
- tomcat提示警告: An attempt was made to authenticate the locked user"tomcat"
启动tomcat7之后,运行正常,但是运行一段时间就会提示以下警告: 十二月 04, 2013 5:10:15 下午 org.apache.catalina.realm.LockOutRealm au ...
- java-Collections工具类使用
Collections工具类方法介绍 Collections.reverse(list);//list顺序反转
- jquery读取iframe子页面和父页面的处理
1. jquery 在iframe子页面获取父页面元素代码如下: $("#objid", parent.document) 2. jquery在父页面 获取iframe子页面的元素 ...