设为首页 收藏本站
查看: 1601|回复: 0

[经验分享] 黄聪:使用Python中的urlparse、urllib抓取和解析网页(一)

[复制链接]

尚未签到

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

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



  import urlparse
  parsedTuple = urlparse.urlparse(
  "http://www.google.com/search?

  hl=en&q=urlparse&btnG=Google+Search")

  unparsedURL = urlparse.urlunparse((URLscheme, \
  URLlocation, URLpath, '', '', ''))
  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基地址以字符/结尾。
  下面是上面几个函数的详细一点的用法举例:



  import urlparse
  URLscheme = "http"
  URLlocation = "www.python.org"
  URLpath = "lib/module-urlparse.html"
  modList = ("urllib", "urllib2", \
  "httplib", "cgilib")
  #将地址解析成组件

  print "用Google搜索python时地址栏中URL的解析结果"
  parsedTuple = urlparse.urlparse(
  "http://www.google.com/search?

  hl=en&q=python&btnG=Google+Search")

  print parsedTuple
  #将组件反解析成URL

  print "\反解析python文档页面的URL"
  unparsedURL = urlparse.urlunparse( \
  (URLscheme, URLlocation, URLpath, '', '', ''))
  print "\t" + unparsedURL
  #将路径和新文件组成一个新的URL

  print "\n利用拼接方式添加更多python文档页面的URL"
  for mod in modList:
  newURL = urlparse.urljoin(unparsedURL, \
  "module-%s.html" % (mod))
  print "\t" + newURL
  #通过为路径添加一个子路径来组成一个新的URL

  print "\n通过拼接子路径来生成Python文档页面的URL"
  newURL = urlparse.urljoin(unparsedURL,
  "module-urllib2/request-objects.html")
  print "\t" + newURL
  上述代码的执行结果如下所示:
  用Google搜索python时地址栏中URL的解析结果



  ('http', 'www.google.com', '/search', '',
  'hl=en&q=python&btnG=Google+Search', '')
  反解析python文档页面的URL
  http://www.python.org/lib/module-urlparse.html
  利用拼接方式添加更多python文档页面的URL
  http://www.python.org/lib/module-urllib.html
  http://www.python.org/lib/module-urllib2.html
  http://www.python.org/lib/module-httplib.html
  http://www.python.org/lib/module-cgilib.html
  通过拼接子路径来生成Python文档页面的URL
  http://www.python.org/lib/module-urllib2/request-objects.html
二、打开HTML文档
  上面介绍了如何解析页面的URL,现在开始讲解如何通过URL打开一个网页。实际上,Python所带的urllib和urllib2这两个模块为我们提供了从URL打开并获取数据的功能,当然,这包括HTML文档。



  import urllib
  u = urllib.urlopen(webURL)
  u = urllib.urlopen(localURL)
  buffer = u.read()
  print u.info()
  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位置有关的元数据,比如内容长度、内容类型,等等。下面通过一个较为详细的例子来对这些函数进行说明。



  import urllib
  webURL = "http://www.python.org"
  localURL = "index.html"
  #通过URL打开远程页面

  u = urllib.urlopen(webURL)
  buffer = u.read()
  print u.info()
  print "从%s读取了%d 字节数据.\n" % (u.geturl(),len(buffer) )
  #通过URL打开本地页面

  u = urllib.urlopen(localURL)
  buffer = u.read()
  print u.info()
  print "从%s读取了%d 字节数据.\n" % (u.geturl(),len(buffer) )
  上面代码的运行结果如下所示:



  Date: Fri, 26 Jun 2009 10:22:11 GMT
  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
  Last-Modified: Thu, 25 Jun 2009 09:44:54 GMT
  ETag: "105800d-46e7-46d29136f7180"
  Accept-Ranges: bytes
  Content-Length: 18151
  Connection: close
  Content-Type: text/html
  从http://www.python.org读取了18151 字节数据.
  Content-Type: text/html
  Content-Length: 865
  Last-modified: Fri, 26 Jun 2009 10:16:10 GMT
  从index.html读取了865 字节数据.
三、小结
  对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理。事实上,通过Python
语言提供的各种模块,我们无需借助Web服务器或者Web浏览器就能够解析和处理HTML文档。本文中,我们介绍了一个可以帮助简化打开位于本地和Web
上的HTML文档的Python模块。在下篇中,我们将论述如何使用Python模块来迅速解析在HTML文件中的数据,从而处理特定的内容,如链接、图
像和Cookie等。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58611-1-1.html 上篇帖子: 使用python的unittest做测试 下篇帖子: 初试PyOpenGL二 (Python+OpenGL)基本地形生成与高度检测
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表