上一小节咱们提出了一个问题:为何要学习BS4html
前面的学习中我一直使用RE,以为也不是很难用,可是,上网查资料的时候看到大部分都使用BS4,还有不少人一直说BS4很好,虽然BS4很好,可是这还不足以让我去学习它,总不能别人说什么好就去作什么事情吧,因此我决定花点心思找一找,有没有某些状况,使用RE无法实现或者很难实现,可是BS4却很容易实现的呢?若是真的找到的话,这会是一个很好的学习bs4的理由
html5
咱们来看看下面一个网页:http://www.w3school.com.cn/html5/html_5_intro.asp
python
这是一个免费的网络教程网站,如今我须要作这样一个尝试,从网页源码中将文章的标题,正文的内容取出来,为了便于分析,这里仍是贴上源码web
<div id="maincontent"> <h1>HTML 5 简介</h1> <div id="tpn"> <ul class="prenext"> <li class="pre"><a href="/html5/index.asp" title="HTML5 教程">HTML5 教程</a></li> <li class="next"><a href="/html5/html_5_video.asp" title="HTML5 视频">HTML5 视频</a></li> </ul> </div> <div id="intro"> <p><strong>HTML5 是下一代的 HTML。</strong></p> </div> <div> <h2>什么是 HTML5?</h2> <p>HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。</p> <p>HTML 的上一个版本诞生于 1999 年。自从那之后,Web 世界已经经历了巨变。</p> <p>HTML5 仍处于完善之中。然而,大部分现代浏览器已经具有了某些 HTML5 支持。</p> </div> <div> <h2>HTML5 是如何起步的?</h2> <p>HTML5 是 W3C 与 WHATWG 合做的结果。</p> <p class="note"><span>编者注:</span>W3C 指 World Wide Web Consortium,万维网联盟。</p> <p class="note"><span>编者注:</span>WHATWG 指 Web Hypertext Application Technology Working Group。</p> <p>WHATWG 致力于 web 表单和应用程序,而 W3C 专一于 XHTML 2.0。在 2006 年,双方决定进行合做,来建立一个新版本的 HTML。</p> <p>为 HTML5 创建的一些规则:</p> <ul> <li>新特性应该基于 HTML、CSS、DOM 以及 JavaScript。</li> <li>减小对外部插件的需求(好比 Flash)</li> <li>更优秀的错误处理</li> <li>更多取代脚本的标记</li> <li>HTML5 应该独立于设备</li> <li>开发进程应对公众透明</li> </ul> </div>
好,咱们来分析一下怎么从网页中获取咱们想要的数据,首先,大的标题是在 <h1>HTML 5 简介</h1> 里面,而后<h2>......</h2>是小的标题,正文的内容在<p>......</p>或者<li>......</li>里面,第一眼看过去可能以为这个规律这么好找,因此re应该很好写,但实际上真的是这样吗?咱们来试试看吧,按照咱们前面对源码的分析,我首先会这样写,浏览器
<h1>(.*?)</h1>.*?<h2>(.*?)</h2>.*?<p>(.*?)</p>.*?<li>(.*?)</li>
可是这样的输出结果是什么呢?网络
明显不是咱们想要的结果,为何会这么少,究竟发生了什么事情ide
其实缘由很简单,这样写的re是同时匹配这4个标签的,它只会按照上面写的顺序去匹配内容,若是咱们网页中全部的内容都是按下面这样的格式写的话,re很容易匹配学习
<h1>HTML 5 简介</h1> <h2>什么是 HTML5?</h2> <p>HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。</p> <li>新特性应该基于 HTML、CSS、DOM 以及 JavaScript。</li>
可是网页上的源码并非这样的,它多是<h2>......</h2><p>......</p>或者<h2>......</h2><li>......</li>这样各类乱入的,re就不能适应这种状况,它并不会识别这些乱了套的标签,由于事实上,它查找的流程是这样的网站
你们好我是re,我要先匹配<h1>......</h1>,找到内容了,好,那就匹配下一个<h2>......</h2>
url
可是这些<div,<ul,<li......这些是什么鬼,我要找的不是这些,别来烦我啦,我要继续往下找,额?又找到了,好耶
我如今须要匹配第三个<p>......</p>,可是中间仍是碰到好多<h2>,<li>的,咦?这个<h2>好像很眼熟捏?这个不是我上回找的那个吗?可是无论了,我如今找的不是这个,我要找的是<p>,好,终于又找到了
接下来是<li>,中间仍是遇到不少的<h2>,<p>,真是的,一每天的没事作来烦我,我要赶忙找到<li>,OK,找到了,可是这只是第一轮,我还要再找找看有没有<h1>
貌似真的找不到<h1>的标签了,好了,完美收工,今天就到这里吧
若是照这样的流程,那咱们彷佛没有办法可以获取咱们想要的信息了,其实否则,方法是人想出来的嘛,咱们能够绕点远路,曲线救国,我这里给你们提供两个思路
写四个re分别获取<h1><h2><p><li>的数据,而后将获取的数据整理再拼接起来
好比可使用<h1>(.*?)</h1>,<h2>(.*?)</h2>......获取相对应的值,而后将这些内容在输出的时候进行拼接处理
2.先获取一整个代码块的内容,而后将不须要的部分删掉
咱们看到,咱们要获取的部分是在<div id="maincontent">到<div id="bpn">之间的内容,这应该是整个网页源码中比较有规律的一块,咱们可使用re将这部分的内容取出来,就像这样
<div id="maincontent">(.*?)<div id="bpn">
而后中间的标签或者是各类符号什么的咱们可使用re再进行处理,将这些内容去掉
可是这样的方法其实也仍是很麻烦的,还有没有别的方法呢?若是使用BS4呢?会不会好一点?
我这里就直接上代码了,如今能够不用管代码是怎么实现的,看懂看不懂都不要紧,反正后面也会学习到的,这代码包括查资料什么的总共花了十几分钟,以前没有任何BS4的知识,写得很差但仍是能够看出效果,你们随意感觉下
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = '217小月月坑' ''' 为何要使用bs4 ''' import urllib2 from bs4 import BeautifulSoup # 获取网页内容 url = 'http://www.w3school.com.cn/html5/html_5_intro.asp' headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0'} request = urllib2.Request(url,headers=headers) response = urllib2.urlopen(request) contents = response.read().decode("gbk") # bs4进行处理 soup = BeautifulSoup(contents) result = soup.find(id="maincontent") result_str = str(result) soup = BeautifulSoup(result_str) print soup.get_text()
咱们来看看结果
除去获取网页源码的部分,整个BS4的处理只用了5行代码就基本实现咱们想要的效果,这比RE要方便不少吧,固然,这只是其中的一种状况,还有不少种状况使用BS4比RE要方便得多,以及BS4和RE一块儿使用的,甚至BS4中嵌入RE使用的,这些内容在后面都会尽可能讲到,固然是以实例的方式来学习,毕竟看了好多无聊的文档,己所不欲勿施于人