上一小节我们学习了find 和 find_all 函数,我们也知道find_all 函数返回的结果是一个列表,然而我们并不想要列表,列表不利于我们查看,所以我们只能使用find,find会将匹配的结果直接返回,那么find()函数有这么多参数,name,keyword,attrs,text,recursive,我们需要使用哪个参数呢?
我们来看看网页源码
Beautiful Soup 4.2.0 文档 ¶
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.这篇文档介绍了BeautifulSoup4中所有主要特性,并切有小例子.让我来向你展示它适合做什么,如何工作,怎样使用,如何达到你想要的效果,和处理异常情况.
文档中出现的例子在Python2.7和Python3.2中的执行结果相同
你可能在寻找
Beautiful Soup3 的文档,Beautiful Soup 3 目前已经停止开发,我们推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4
这是网页源码中正文开始的部分,我们看到,有<h1>标签,这是标题,还有<p>标签,这是段落,里面则是文章的内容,当然,这只是其中很小很小的部分,我们想要获取这些内容,需要传入find函数的哪个参数呢?我们来一个一个的分析,顺便加深印象
name :name参数是针对tag进行操作的,我们想要获取全部的正文内容的话,就要分别对<h1>,<p>,<li>等标签进行获取,当然肯定还会有其他的标签,find('h1')是获取所有<h1>标签的内容,其他的也一样,所以我们在输出的时候还需要对结果进行整合,这个相当麻烦,根本分不清哪个标题对应那段文字,所以这个 pass
keyword:keyword据说是可以按tag标签的属性进行查找,那我这里可以找到整个正文内容包含在哪个代码块中,可能是class="xxxbody" 或者 id="xxx"等等,我可以使用这个参数将整个正文所在的代码块抠出来,这样章节的顺序是不会变化的,这个方法好像可行,但是我们再看看还有没有更好的方法
attrs:attrs是针对于匹配一些与关键字相同的字符串,比如import,class等等,这里应该是用不到的
text:啊,这个根本是想都不用想的好嘛,这个是根据text的字符串来寻找相对应的内容,我们要传一个字符串进去,然后find函数会寻找含有这个字符串的句子,这完全跟我们要实现的功能不搭调的
recursive:这个参数设置是否遍历某个tag的所有子孙节点,这个好像可以使用,我们只要传入一个tag就可以了嘛,但前提是,你的这个tag必须是唯一的,我们现在这个网页源码中,正文内容的父节点的tag是<div>,可是,源码中还有很多的<div>,我们将这个tag传进去的话程序并不知道我们要寻找的是哪个<div>里面的子孙节点,程序运行不能达到我们想要的效果
所以没办法了,只能使用第二个参数了,现在的问题是,应该传入什么keyword
通过对源码的分析,我觉得这句代码很有可能
这个articleBody 的英文看起来好像是文章主题的意思,而且,一般规范的程序为了便于后面的修改和维护,它的函数名或者是关键字都会以相关功能的英文名字来命名,这是阅读程序的一个小技巧,我觉得这个articleBody有可能就是我们要的,所以将代码整理一下,看看结果是什么吧
#!/usr/bin/env python# -*- coding:UTF-8 -*-__author__ = '217小月月坑''''获取文章主体'''import urllib2from bs4 import BeautifulSoupurl = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#'request = urllib2.Request(url)response = urllib2.urlopen(request)contents = response.read()soup = BeautifulSoup(contents)# 传入keyword参数result = soup.find(itemprop="articleBody")print result
输出结果
好了,结果证明正文部分的代码已经被抠出来了,但是,我们不能就这样将结果直接写入文件,我们还要从这段源码中获取正文的内容,也就是那些文字什么的,那好,我们就来看一下应该使用什么方法来获取正文的内容