对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文将详细介绍如何利用Python抓取和解析网页。首 先,我们介绍一个可以帮助简化打开位于本地和Web上的HTML文档的Python模块,然后,我们论述如何使用Python模块来迅速解析在HTML文 件中的数据,从而处理特定的内容,如链接、图像和Cookie等。最后,我们会给出一个规整HTML文件的格式标签的例子,通过这个例子您会发现使用 python处理HTML文件的内容是非常简单的一件事情。

一、解析URL

通过Python所带的urlparse模块,我们能够轻松地把URL分解成元件,之后,还能将这些元件重新组装成一个URL。当我们处理HTML 文档的时候,这项功能是非常方便的。

  1. import urlparse
  2.   parsedTuple = urlparse.urlparse("http://www.google.com/search?hl=en&q=urlparse&btnG=Google+Search")
  3.   unparsedURL = urlparse.urlunparse((URLscheme, URLlocation, URLpath, '', '', ''))
  4.   newURL = urlparse.urljoin(unparsedURL,"/module-urllib2/request-objects.html")

 函数urlparse(urlstring [, default_scheme [, allow_fragments]])的作用是将URL分解成不同的组成部分,它从urlstring中取得URL,并返回元组 (scheme, netloc, path, parameters, query, fragment)。注意,返回的这个元组非常有用,例如可以用来确定网络协议(HTTP、FTP等等 )、服务器地址、文件路径,等等。

  函数urlunparse(tuple)的作用是将URL的组件装配成一个URL,它接收元组(scheme, netloc, path, parameters, query, fragment)后,会重新组成一个具有正确格式的URL,以便供Python的其他HTML解析模块使用。

  函数urljoin(base, url [, allow_fragments]) 的作用是拼接URL,它以第一个参数作为其基地址,然后与第二个参数中的相对地址相结合组成一个绝对URL地址。函数urljoin在通过为URL基地址 附加新的文件名的方式来处理同一位置处的若干文件的时候格外有用。需要注意的是,如果基地址并非以字符/结尾的话,那么URL基地址最右边部分就会被这个 相对路径所替换。比如,URL的基地址为Http://www.testpage.com/pub,URL的相对地址为test.html,那么两者将合 并成http://www.testpage.com/test.html,而非http://www.testpage.com/pub /test.html。如果希望在该路径中保留末端目录,应确保URL基地址以字符/结尾。

  下面是上面几个函数的详细一点的用法举例:

  1.  import urlparse
  2.  
  3.   URLscheme = "http"
  4.  
  5.   URLlocation = "www.python.org"
  6.  
  7.   URLpath = "lib/module-urlparse.html"
  8.  
  9.   modList = ("urllib", "urllib2", \
  10.  
  11.   "httplib", "cgilib")
  12.  
  13.   #将地址解析成组件
  14.  
  15.   print "用Google搜索python时地址栏中URL的解析结果"
  16.  
  17.   parsedTuple = urlparse.urlparse(
  18.  
  19.   "http://www.google.com/search?
  20.  
  21.   hl=en&q=python&btnG=Google+Search")
  22.  
  23.   print parsedTuple
  24.  
  25.   #将组件反解析成URL
  26.  
  27.   print "\反解析python文档页面的URL"
  28.  
  29.   unparsedURL = urlparse.urlunparse( \
  30.  
  31.   (URLscheme, URLlocation, URLpath, '', '', ''))
  32.  
  33.   print "\t" + unparsedURL
  34.  
  35.   #将路径和新文件组成一个新的URL
  36.  
  37.   print "\n利用拼接方式添加更多python文档页面的URL"
  38.  
  39.   for mod in modList:
  40.  
  41.   newURL = urlparse.urljoin(unparsedURL, \
  42.  
  43.   "module-%s.html" % (mod))
  44.  
  45.   print "\t" + newURL
  46.  
  47.   #通过为路径添加一个子路径来组成一个新的URL
  48.  
  49.   print "\n通过拼接子路径来生成Python文档页面的URL"
  50.  
  51.   newURL = urlparse.urljoin(unparsedURL,
  52.  
  53.   "module-urllib2/request-objects.html")
  54.  
  55.   print "\t" + newURL

 上述代码的执行结果如下所示:

  用Google搜索python时地址栏中URL的解析结果

  1.  ('http', 'www.google.com', '/search', '',
  2.  
  3.   'hl=en&q=python&btnG=Google+Search', '')
  4.  
  5.   反解析python文档页面的URL
  6.  
  7.   http://www.python.org/lib/module-urlparse.html
  8.  
  9.   利用拼接方式添加更多python文档页面的URL
  10.  
  11.   http://www.python.org/lib/module-urllib.html
  12.  
  13.   http://www.python.org/lib/module-urllib2.html
  14.  
  15.   http://www.python.org/lib/module-httplib.html
  16.  
  17.   http://www.python.org/lib/module-cgilib.html
  18.  
  19.   通过拼接子路径来生成Python文档页面的URL
  20.  
  21.   http://www.python.org/lib/module-urllib2/request-objects.html

二、打开HTML文档

  上面介绍了如何解析页面的URL,现在开始讲解如何通过URL打开一个网页。实际上,Python所带的urllib和urllib2这两个模块为我们提供了从URL打开并获取数据的功能,当然,这包括HTML文档。

  1.   import urllib
  2.  
  3.   u = urllib.urlopen(webURL)
  4.  
  5.   u = urllib.urlopen(localURL)
  6.  
  7.   buffer = u.read()
  8.  
  9.   print u.info()
  10.  
  11.   print "从%s读取了%d 字节数据.\n" % (u.geturl(),len(buffer) )

  若要通过urllib模块中的urlopen(url [,data])函数打开一个HTML文档,必须提供该文档的URL地址,包括文件名。函数urlopen不仅可以打开位于远程web服务器上的文件,而 且可以打开一个本地文件,并返回一个类似文件的对象,我们可以通过该对象从HTML文档中读出数据。

  一旦打开了HTML文档,我们就可以像使用常规文件一样使用read([nbytes])、readline()和readlines()函数来对文件进行读操作。若要读取整个HTML文档的内容的话,您可以使用read()函数,该函数将文件内容作为字符串返回。

  打开一个地址之后,您可以使用geturl()函数取得被获取网页的真正的URL。这是很有用的,因为urlopen(或使用的opener对象)也许会伴随一个重定向。获取的网页URL也许和要求的网页URL不一样。

  另一个常用的函数是位于从urlopen返回的类文件对象中的info()函数,这个函数可以返回URL位置有关的元数据,比如内容长度、内容类型,等等。下面通过一个较为详细的例子来对这些函数进行说明。

  1.   import urllib
  2.  
  3.   webURL = "http://www.python.org"
  4.  
  5.   localURL = "index.html"
  6.  
  7.   #通过URL打开远程页面
  8.  
  9.   u = urllib.urlopen(webURL)
  10.  
  11.   buffer = u.read()
  12.  
  13.   print u.info()
  14.  
  15.   print "从%s读取了%d 字节数据.\n" % (u.geturl(),len(buffer) )
  16.  
  17.   #通过URL打开本地页面
  18.  
  19.   u = urllib.urlopen(localURL)
  20.  
  21.   buffer = u.read()
  22.  
  23.   print u.info()
  24.  
  25.   print "从%s读取了%d 字节数据.\n" % (u.geturl(),len(buffer) )

上面代码的运行结果如下所示:

  1.   Date: Fri, 26 Jun 2009 10:22:11 GMT
  2.  
  3.   Server: Apache/2.2.9 (Debian) DAV/2 SVN/1.5.1 mod_ssl/2.2.9 OpenSSL/0.9.8g mod_wsgi/2.3 Python/2.5.2
  4.  
  5.   Last-Modified: Thu, 25 Jun 2009 09:44:54 GMT
  6.  
  7.   ETag: "105800d-46e7-46d29136f7180"
  8.  
  9.   Accept-Ranges: bytes
  10.  
  11.   Content-Length: 18151
  12.  
  13.   Connection: close
  14.  
  15.   Content-Type: text/html
  16.  
  17.   http://www.python.org读取了18151 字节数据.
  18.  
  19.   Content-Type: text/html
  20.  
  21.   Content-Length: 865
  22.  
  23.   Last-modified: Fri, 26 Jun 2009 10:16:10 GMT
  24.  
  25.   index.html读取了865 字节数据.

三、小结

  对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文中,我们介绍了一个可以帮助简化打开位于本地和Web 上的HTML文档的Python模块。在下篇中,我们将论述如何使用Python模块来迅速解析在HTML文件中的数据,从而处理特定的内容,如链接、图 像和Cookie等。

作者:黄聪
出处:http://www.cnblogs.com/huangcong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 
 

Python中的urlparse、urllib抓取和解析网页(一)的更多相关文章

  1. 使用Python中的urlparse、urllib抓取和解析网页(一)(转)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  2. 【python】使用Python中的urlparse、urllib抓取和解析网页

    一.解析URL 函数urlparse(urlstring [, default_scheme [, allow_fragments]])的作用是将URL分解成不同的组成部分,它从urlstring中取 ...

  3. 【python】使用HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies

    一.从HTML文档中提取链接 模块HTMLParser,该模块使我们能够根据HTML文档中的标签来简洁.高效地解析HTML文档. 处理HTML文档的时候,我们常常需要从其中提取出所有的链接.使用HTM ...

  4. c# 抓取和解析网页,并将table数据保存到datatable中(其他格式也可以,自己去修改)

    使用HtmlAgilityPack 基础请参考这篇博客:https://www.cnblogs.com/fishyues/p/10232822.html 下面是根据抓取的页面string 来解析并保存 ...

  5. Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息

    需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache. ...

  6. 使用Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)(转)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过 Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  7. Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过 Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  8. Python爬虫实战四之抓取淘宝MM照片

    原文:Python爬虫实战四之抓取淘宝MM照片其实还有好多,大家可以看 Python爬虫学习系列教程 福利啊福利,本次为大家带来的项目是抓取淘宝MM照片并保存起来,大家有没有很激动呢? 本篇目标 1. ...

  9. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

随机推荐

  1. [JZOJ4330] 【清华集训模拟】几何题

    题目 题目大意 也懒得解释题目大意了-- 正解 正解居然是\(FFT\)? 不要看题目的那个式子这么长,也不要在那个式子上下手. 其实我们会发现,不同的\((x_i-x_j,y_i-y_j,z_i-z ...

  2. ImageMagick convert多张照片JPG转成pdf格式,pdfunite合并PDF文件

      在认识ImageMagick之前,我***的图像浏览软件是KuickShow,截图软件是KSnapShot,这两款软件都是KDE附带的软件,用起来也是蛮方便的.在一次偶然的机会中,我遇到了Imag ...

  3. VS2010-MFC(对话框:颜色对话框)

    转自:http://www.jizhuomi.com/software/177.html 颜色对话框大家肯定也不陌生,我们可以打开它选择需要的颜色,简单说,它的作用就是用来选择颜色.MFC中提供了CC ...

  4. 使用串口绘制实时曲线 —— SerialChart

    SerialChart:下载 1. 实验效果 2. 串口程序 ){ ){ y = ; x = ; } ) y++; else y--; z = sin(x*Pi/); p = cos(x*Pi/); ...

  5. wangEditor 菜单栏随页面滚动位置改变(吸顶)问题解决

    参考:https://www.kancloud.cn/wangfupeng/wangeditor2/113980 当页面向下滚动到隐藏了菜单栏时,编辑器默认会fixed菜单栏,即让菜单栏保持『吸顶』状 ...

  6. Django问题

    Django问题 'WSGIRequest' object has no attribute 'user' django python 关注 2 关注 收藏 0 收藏,413 浏览   当我的djan ...

  7. leetcode146周赛-5130-等价多米诺骨牌对的数量

    题目描述: 方法一: class Solution(object): def numEquivDominoPairs(self, dominoes): """ :type ...

  8. leetcode-117-填充每个节点的下一个右侧节点指针②

    ---恢复内容开始--- 题目描述: 方法一:层次遍历 """ # Definition for a Node. class Node: def __init__(sel ...

  9. zabbix被监控端代理设置

    zabbix被监控端代理设置 安装zabbix-agent客户端 rpm -ivh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-re ...

  10. a common method to rotate the image

    /* * clockwise rotate * first reverse up to down, then swap the symmetry * 1 2 3 7 8 9 7 4 1 * 4 5 6 ...