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 ...
随机推荐
- windows 内部预览版与迅雷极速版不配合
为了体验bash on ubuntu安装的预览版本,结果原来的迅雷极速版本无法成功下载文件,总是在最后一刻报错退出. 解决方法是: 下载安装迅雷9 哈哈哈哈,新版迅雷挺不错的,运行良好. ctrl^v ...
- 十天冲刺---Day7
站立式会议 站立式会议内容总结: 燃尽图 照片 两个人编码其实效率挺高的.但是在一些方面,比如说页面UI的编写,会非常吃力,很难达到自己的效果. 由于埋头在编码,所以issues的增加随之停止. 有点 ...
- Beta项目冲刺--第三天
又找回熟悉的感觉.... 队伍:F4 成员:031302301 毕容甲 031302302 蔡逸轩 031302430 肖阳 031302418 黄彦宁 会议内容: 1.站立式会议照片: 2.项目燃尽 ...
- Hibernated的sql查询
记录一下学习Hibernate的心得 1.为什么HIbernate会支持原生态的sql查询? HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中, ...
- 关于web前端的学习路线
第一阶段: HTML+CSS:HTML进阶.CSS进阶.div+css布局.HTML+css整站开发. JavaScript基础:Js基础教程.js内置对象常用方法.常见DOM树操作大全.ECMAsc ...
- C# 多线程join的用法,等待多个子线程结束后再执行主线程
等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = ...
- 【BZOJ 3242】【UOJ #126】【CodeVS 3047】【NOI 2013】快餐店
http://www.lydsy.com/JudgeOnline/problem.php?id=3242 http://uoj.ac/problem/126 http://codevs.cn/prob ...
- thinkphp全站静态页实现方法
1:在根目录下的全局index.php中加下面这行: define('HTML_PATH', './htm');//生成静态页面的文件位置 2:在项目的配置文件config.php中加下面这行: 'H ...
- java-汉字转换拼音-pinyin4j.jar
使用pinyin4j将汉字转成拼音,附件为pinyin4j的jar包 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcefo ...
- eclipse中maven install和build,clean
eclipse插件,m2eclipse 1.maven install相当于maven原生的命令: mvn install 2.aven build是 m2eclipse这个插件自己创造的概念,需要你 ...